Adds drafts tab data
This commit is contained in:
parent
5db3485079
commit
95c9e4eb4e
|
@ -0,0 +1,16 @@
|
||||||
|
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: String;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
import { RecentActivityModel } from "./recent-activity.model";
|
||||||
|
|
||||||
|
export class RecentDatasetModel extends RecentActivityModel {
|
||||||
|
dmp: String;
|
||||||
|
dmpId: String;
|
||||||
|
dataRepositories: String;
|
||||||
|
registries: String;
|
||||||
|
services: String;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
import { RecentActivityModel } from './recent-activity.model';
|
||||||
|
import { RecentDatasetModel } from './recent-dataset-activity.model';
|
||||||
|
import { DmpAssociatedProfileModel } from '../dmp-profile/dmp-associated-profile';
|
||||||
|
import { UserInfoListingModel } from '../user/user-info-listing';
|
||||||
|
|
||||||
|
export class RecentDmpModel extends RecentActivityModel {
|
||||||
|
doi: String;
|
||||||
|
extraProperties: Map<String, any>;
|
||||||
|
datasets: RecentDatasetModel[];
|
||||||
|
associatedProfiles: DmpAssociatedProfileModel[];
|
||||||
|
organisations: String;
|
||||||
|
groupId: string;
|
||||||
|
users: UserInfoListingModel[];
|
||||||
|
isPublic: boolean;
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import { environment } from '../../../../environments/environment';
|
||||||
import { DashboardStatisticsModel } from '../../model/dashboard/dashboard-statistics-model';
|
import { DashboardStatisticsModel } from '../../model/dashboard/dashboard-statistics-model';
|
||||||
import { BaseHttpService } from '../http/base-http.service';
|
import { BaseHttpService } from '../http/base-http.service';
|
||||||
import { ConfigurationService } from '../configuration/configuration.service';
|
import { ConfigurationService } from '../configuration/configuration.service';
|
||||||
|
import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DashboardService {
|
export class DashboardService {
|
||||||
|
@ -25,7 +26,7 @@ export class DashboardService {
|
||||||
return this.http.get<DashboardStatisticsModel>(this.actionUrl + 'me/getStatistics', { headers: this.headers });
|
return this.http.get<DashboardStatisticsModel>(this.actionUrl + 'me/getStatistics', { headers: this.headers });
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecentAcitvity(): Observable<any[]> {
|
getRecentAcitvity(): Observable<RecentActivityModel[]> {
|
||||||
return this.http.get<any[]>(this.actionUrl + 'recentActivity', {headers: this.headers});
|
return this.http.get<RecentActivityModel[]>(this.actionUrl + 'recentActivity', {headers: this.headers});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,30 +53,21 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="latest-activity-title">Latest activity</div>
|
<div class="latest-activity-title">Latest activity</div>
|
||||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom">
|
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom">
|
||||||
<!-- +counter -->
|
|
||||||
<mat-tab label="All">
|
<mat-tab label="All">
|
||||||
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
||||||
<app-recent-edited-activity></app-recent-edited-activity>
|
<app-recent-edited-activity></app-recent-edited-activity>
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<button type="button" class="btn-load-more">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
|
||||||
</div>
|
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
<mat-tab label="{{'DASHBOARD.DRAFTS' | translate}}">
|
<mat-tab label="{{'DASHBOARD.DRAFTS' | translate}} ({{this.totalDraftDatasets}})">
|
||||||
<app-drafts></app-drafts>
|
|
||||||
</mat-tab>
|
|
||||||
<mat-tab label="{{'DASHBOARD.DMPS' | translate}}">
|
|
||||||
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
||||||
<app-recent-edited-activity></app-recent-edited-activity>
|
<app-drafts (totalCountDraftDatasets)="onCountDraftDatasets($event)"></app-drafts>
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<button type="button" class="btn-load-more">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
|
||||||
</div>
|
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
<mat-tab label="{{'DASHBOARD.DATASET-DESCRIPTIONS' | translate}}">
|
<mat-tab label="{{'DASHBOARD.DMPS' | translate}} ({{this.totalDmps}})">
|
||||||
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
||||||
<app-recent-edited-dataset-activity></app-recent-edited-dataset-activity>
|
<app-recent-edited-dmp-activity (totalCountDmps)="onCountDmps($event)"></app-recent-edited-dmp-activity>
|
||||||
<div class="d-flex justify-content-center">
|
</mat-tab>
|
||||||
<button type="button" class="btn-load-more">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
<mat-tab label="{{'DASHBOARD.DATASET-DESCRIPTIONS' | translate}} ({{this.totalDatasets}})">
|
||||||
</div>
|
<div class="col-auto pt-3"><input type="text" class="d-flex ml-auto" placeholder="  Search"></div>
|
||||||
|
<app-recent-edited-dataset-activity (totalCountDatasets)="onCountDatasets($event)"></app-recent-edited-dataset-activity>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
</mat-tab-group>
|
</mat-tab-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -53,6 +53,11 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
||||||
dmpListingItems: DmpListingModel[] = [];
|
dmpListingItems: DmpListingModel[] = [];
|
||||||
datasetListingItems: DatasetListingModel[] = [];
|
datasetListingItems: DatasetListingModel[] = [];
|
||||||
|
|
||||||
|
totalDatasets: number;
|
||||||
|
totalDmps: number;
|
||||||
|
totalDraftDatasets: number;
|
||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
|
@ -185,6 +190,18 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC
|
||||||
this.isVisible = false;
|
this.isVisible = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onCountDmps(event): void {
|
||||||
|
this.totalDmps = event;
|
||||||
|
}
|
||||||
|
|
||||||
|
onCountDatasets(event): void {
|
||||||
|
this.totalDatasets = event;
|
||||||
|
}
|
||||||
|
|
||||||
|
onCountDraftDatasets(event): void {
|
||||||
|
this.totalDraftDatasets = event;
|
||||||
|
}
|
||||||
|
|
||||||
// viewAllPublicDmpsClicked() {
|
// viewAllPublicDmpsClicked() {
|
||||||
// this.router.navigate(['/explore-plans']);
|
// this.router.navigate(['/explore-plans']);
|
||||||
// }
|
// }
|
||||||
|
|
|
@ -15,8 +15,8 @@ import { WizardComponent } from '@app/ui/dashboard/wizard/wizard.component';
|
||||||
import { CommonUiModule } from '@common/ui/common-ui.module';
|
import { CommonUiModule } from '@common/ui/common-ui.module';
|
||||||
import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module';
|
import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module';
|
||||||
import { RecentEditedDatasetActivityComponent } from './recent-edited-dataset-activity/recent-edited-dataset-activity.component';
|
import { RecentEditedDatasetActivityComponent } from './recent-edited-dataset-activity/recent-edited-dataset-activity.component';
|
||||||
import { DatasetCopyDialogueComponent } from '../dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component';
|
|
||||||
import { DatasetCopyDialogModule } from '../dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module';
|
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';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -38,7 +38,8 @@ import { DatasetCopyDialogModule } from '../dataset/dataset-wizard/dataset-copy-
|
||||||
DraftsComponent,
|
DraftsComponent,
|
||||||
DmpInfoCounterComponent,
|
DmpInfoCounterComponent,
|
||||||
DatasetInfoCounterComponent,
|
DatasetInfoCounterComponent,
|
||||||
RecentEditedDatasetActivityComponent
|
RecentEditedDatasetActivityComponent,
|
||||||
|
RecentEditedDmpActivityComponent
|
||||||
],
|
],
|
||||||
entryComponents: [
|
entryComponents: [
|
||||||
QuickWizardCreateAdd
|
QuickWizardCreateAdd
|
||||||
|
|
|
@ -1,4 +1,181 @@
|
||||||
.grey {
|
.latest-activity-title {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 300;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.6;
|
||||||
|
padding-bottom: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-card,
|
||||||
|
.dataset-card {
|
||||||
|
min-width: 712px;
|
||||||
|
/* min-height: 308px; */
|
||||||
|
background: #ffffff 0% 0% no-repeat padding-box;
|
||||||
|
box-shadow: 0px 3px 6px #0000001a;
|
||||||
|
border-radius: 4px;
|
||||||
|
opacity: 1;
|
||||||
|
margin-top: 2.43rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-border-bottom ::ng-deep .mat-tab-header {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
background: #fafafa 0% 0% no-repeat padding-box;
|
||||||
|
border: 1px solid #d1d1d1;
|
||||||
|
border-radius: 4px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 347px;
|
||||||
|
height: 56px;
|
||||||
|
font-family: Arial, FontAwesome;
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edited-date {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 300;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
line-height: 2.4;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-label {
|
||||||
|
background: #129d99 0% 0% no-repeat padding-box;
|
||||||
|
border-radius: 4px 0px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 67px;
|
||||||
|
height: 37px;
|
||||||
|
color: #ffffff;
|
||||||
|
line-height: 2.4;
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-label {
|
||||||
|
width: 158px;
|
||||||
|
height: 37px;
|
||||||
|
background: #f7dd72 0% 0% no-repeat padding-box;
|
||||||
|
border-radius: 4px 0px;
|
||||||
|
text-align: left;
|
||||||
|
line-height: 2.8;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-title,
|
||||||
|
.dataset-title {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.81;
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.55rem;
|
||||||
|
color: #212121;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-subtitle,
|
||||||
|
.dmp-subtitle {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
opacity: 1;
|
||||||
|
align-items: center;
|
||||||
|
color: #848484;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-title-draft {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.81;
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.55rem;
|
||||||
|
color: #f16868;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-align {
|
||||||
|
display: inline-flex;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions,
|
||||||
|
.dmp-card-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
border-top: 1px solid #dbdbdb;
|
||||||
|
line-height: 4;
|
||||||
|
color: #848484;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions a,
|
||||||
|
.dmp-card-actions a {
|
||||||
|
color: #848484 !important;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions a:hover,
|
||||||
|
.dmp-card-actions a:hover {
|
||||||
|
color: #129d99 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-dataset-descriptions-title {
|
||||||
|
color: #000000;
|
||||||
|
opacity: 0.6;
|
||||||
|
padding-top: 1.5rem;
|
||||||
|
padding-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-dataset-descriptions-name {
|
||||||
|
color: #000000;
|
||||||
|
opacity: 0.6;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-more {
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-more:hover {
|
||||||
|
color: #129d99 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-load-more {
|
||||||
|
border: 2px solid #212121;
|
||||||
|
border-radius: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 132px;
|
||||||
|
height: 40px;
|
||||||
|
margin-top: 4.125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-load-more:hover {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draft {
|
||||||
|
color: #f16868;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pointer {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* .grey {
|
||||||
color: rgb(162, 162, 162);
|
color: rgb(162, 162, 162);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,4 +243,4 @@ td:hover .draft-desc:after {
|
||||||
|
|
||||||
.view-all:hover {
|
.view-all:hover {
|
||||||
color: rgb(46, 117, 182) !important;
|
color: rgb(46, 117, 182) !important;
|
||||||
}
|
} */
|
||||||
|
|
|
@ -1,4 +1,69 @@
|
||||||
<div class="card card-draft">
|
<div *ngFor="let activity of datasetDrafts">
|
||||||
|
<div class="dataset-card">
|
||||||
|
<div>
|
||||||
|
<!-- <div [routerLink]="['../datasets/overview/' + activity.id]"> -->
|
||||||
|
<div class="d-flex flex-direction-row">
|
||||||
|
<div class="col-auto dataset-label">{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}</div>
|
||||||
|
<div class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | date:"longDate"}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto dataset-title">{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}: {{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">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
|
||||||
|
<div class="col-auto dmp-label ml-4">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div> -->
|
||||||
|
<div class="col dmp-title">{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{activity.dmp}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<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"><span class="material-icons icon-align pr-2">group_add</span>{{'DATASET-LISTING.ACTIONS.INVITE-COLLABORATORS' | 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.id)" class="menu-item">
|
||||||
|
<mat-icon>file_copy</mat-icon>{{'DATASET-WIZARD.ACTIONS.COPY-DATASET' | translate}}
|
||||||
|
</button>
|
||||||
|
<button mat-menu-item (click)="openConfirm(activity.id)" class="menu-item">
|
||||||
|
<mat-icon>delete</mat-icon>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}
|
||||||
|
</button>
|
||||||
|
<!-- <button mat-menu-item *ngIf="needsUpdate(activity)" class="menu-item" (click)="openUpdateDatasetProfileDialogue(activity.id);">
|
||||||
|
<mat-icon>update</mat-icon>
|
||||||
|
{{ 'DATASET-WIZARD.ACTIONS.UPDATE-DATASET-PROFILE' | 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="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div class="card card-draft">
|
||||||
<div class="card-header card-header-plain">
|
<div class="card-header card-header-plain">
|
||||||
<div class="card-desc">
|
<div class="card-desc">
|
||||||
<h4 class="card-title">{{ 'TYPES.DATASET-STATUS.DRAFT' | translate }}</h4>
|
<h4 class="card-title">{{ 'TYPES.DATASET-STATUS.DRAFT' | translate }}</h4>
|
||||||
|
@ -16,9 +81,6 @@
|
||||||
<i class="material-icons-outlined grey">library_books</i>
|
<i class="material-icons-outlined grey">library_books</i>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<!-- <div class="drafts-more-btn">
|
|
||||||
<i class="material-icons more-icon">more_horiz</i>
|
|
||||||
</div> -->
|
|
||||||
<div class="draft-title">
|
<div class="draft-title">
|
||||||
{{'GENERAL.NAMES.DATASET' | translate}}: {{ dataset.label }} {{'DRAFTS.FOR-DMP' | translate}} {{ dataset.dmp }} {{'DRAFTS.FOR-GRANT' | translate}} {{ dataset.grant }}
|
{{'GENERAL.NAMES.DATASET' | translate}}: {{ dataset.label }} {{'DRAFTS.FOR-DMP' | translate}} {{ dataset.dmp }} {{'DRAFTS.FOR-GRANT' | translate}} {{ dataset.grant }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -35,4 +97,4 @@
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Component, OnInit, Input } from '@angular/core';
|
import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';
|
||||||
import { DatasetService } from '../../../core/services/dataset/dataset.service';
|
import { DatasetService } from '../../../core/services/dataset/dataset.service';
|
||||||
import { DataTableRequest } from '../../../core/model/data-table/data-table-request';
|
import { DataTableRequest } from '../../../core/model/data-table/data-table-request';
|
||||||
import { DatasetCriteria } from '../../../core/query/dataset/dataset-criteria';
|
import { DatasetCriteria } from '../../../core/query/dataset/dataset-criteria';
|
||||||
|
@ -7,32 +7,61 @@ import { AuthService } from '../../../core/services/auth/auth.service';
|
||||||
import { RecentActivityType } from '../../../core/common/enum/recent-activity-type';
|
import { RecentActivityType } from '../../../core/common/enum/recent-activity-type';
|
||||||
import { Router} from '@angular/router';
|
import { Router} from '@angular/router';
|
||||||
import { DmpStatus } from '../../../core/common/enum/dmp-status';
|
import { DmpStatus } from '../../../core/common/enum/dmp-status';
|
||||||
|
import { Principal } from '@app/core/model/auth/principal';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||||
|
import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component';
|
||||||
|
import { FormControl } from '@angular/forms';
|
||||||
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
|
import { MatDialog } from '@angular/material';
|
||||||
|
import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service';
|
||||||
|
import { SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service';
|
||||||
|
import * as FileSaver from 'file-saver';
|
||||||
|
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
||||||
|
import { UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-drafts',
|
selector: 'app-drafts',
|
||||||
templateUrl: './drafts.component.html',
|
templateUrl: './drafts.component.html',
|
||||||
styleUrls: ['./drafts.component.css']
|
styleUrls: ['./drafts.component.css']
|
||||||
})
|
})
|
||||||
export class DraftsComponent implements OnInit {
|
export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
|
@Input() routerLink: string;
|
||||||
|
@Output() totalCountDraftDatasets: EventEmitter<any> = new EventEmitter();
|
||||||
|
|
||||||
datasetDrafts: DatasetListingModel[];
|
datasetDrafts: DatasetListingModel[];
|
||||||
datasetDraftsTypeEnum = RecentActivityType;
|
datasetDraftsTypeEnum = RecentActivityType;
|
||||||
@Input() routerLink: string;
|
|
||||||
status: number;
|
status: number;
|
||||||
|
|
||||||
|
totalCount: number;
|
||||||
|
startIndex: number = 4;
|
||||||
|
pageSize: number = 5;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private datasetService: DatasetService,
|
private datasetService: DatasetService,
|
||||||
private authentication: AuthService
|
private authentication: AuthService,
|
||||||
) { }
|
private language: TranslateService,
|
||||||
|
public dialog: MatDialog,
|
||||||
|
private datasetWizardService: DatasetWizardService,
|
||||||
|
public enumUtils: EnumUtils,
|
||||||
|
private uiNotificationService: UiNotificationService
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
const fields: Array<string> = [];
|
const fields: Array<string> = [];
|
||||||
fields.push('-modified');
|
fields.push('-modified');
|
||||||
const dmpDataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(0, 2, { fields: fields });
|
const dmpDataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(0, 5, { fields: fields });
|
||||||
dmpDataTableRequest.criteria = new DatasetCriteria();
|
dmpDataTableRequest.criteria = new DatasetCriteria();
|
||||||
dmpDataTableRequest.criteria.status = DmpStatus.Draft;
|
dmpDataTableRequest.criteria.status = DmpStatus.Draft;
|
||||||
this.datasetService.getPaged(dmpDataTableRequest).subscribe(response => {
|
this.datasetService.getPaged(dmpDataTableRequest).subscribe(response => {
|
||||||
this.datasetDrafts = response.data;
|
this.datasetDrafts = response.data;
|
||||||
|
this.totalCount = response.totalCount;
|
||||||
|
this.totalCountDraftDatasets.emit(this.totalCount);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,4 +92,147 @@ export class DraftsComponent implements OnInit {
|
||||||
if (!this.isAuthenticated()) { return; }
|
if (!this.isAuthenticated()) { return; }
|
||||||
this.router.navigate(['/datasets'], { queryParams: { status: 0 } });
|
this.router.navigate(['/datasets'], { queryParams: { status: 0 } });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
roleDisplay(value: any) {
|
||||||
|
const principal: Principal = this.authentication.current();
|
||||||
|
let role: number;
|
||||||
|
if (principal) {
|
||||||
|
value.forEach(element => {
|
||||||
|
if (principal.id === element.id) {
|
||||||
|
role = element.role;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (role === 0) {
|
||||||
|
return this.language.instant('DMP-LISTING.OWNER');
|
||||||
|
}
|
||||||
|
else if (role === 1) {
|
||||||
|
return this.language.instant('DMP-LISTING.MEMBER');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this.language.instant('DMP-LISTING.OWNER');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
openDmpSearchDialogue(dataset: DatasetListingModel) {
|
||||||
|
const formControl = new FormControl();
|
||||||
|
const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, {
|
||||||
|
width: '500px',
|
||||||
|
restoreFocus: false,
|
||||||
|
data: {
|
||||||
|
formControl: formControl,
|
||||||
|
datasetId: dataset.id,
|
||||||
|
datasetProfileId: dataset.profile,
|
||||||
|
datasetProfileExist: false,
|
||||||
|
confirmButton: this.language.instant('DATASET-WIZARD.DIALOGUE.COPY'),
|
||||||
|
cancelButton: this.language.instant('DATASET-WIZARD.DIALOGUE.CANCEL')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
dialogRef.afterClosed().pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(result => {
|
||||||
|
if (result && result.datasetProfileExist) {
|
||||||
|
const newDmpId = result.formControl.value.id
|
||||||
|
this.router.navigate(['/datasets/copy/' + result.datasetId], { queryParams: { newDmpId: newDmpId } });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
openConfirm(id: string): void {
|
||||||
|
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
||||||
|
maxWidth: '300px',
|
||||||
|
restoreFocus: false,
|
||||||
|
data: {
|
||||||
|
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'),
|
||||||
|
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'),
|
||||||
|
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
|
||||||
|
isDeleteConfirmation: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (result) {
|
||||||
|
this.datasetWizardService.delete(id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(
|
||||||
|
complete => this.onCallbackSuccess(),
|
||||||
|
error => this.onCallbackError(error)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
onCallbackSuccess(id?: String): void {
|
||||||
|
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
||||||
|
id ? this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'edit', id]); }) : this.router.navigate(['/datasets']);
|
||||||
|
}
|
||||||
|
|
||||||
|
onCallbackError(error: any) {
|
||||||
|
// this.setErrorModel(error.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.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadDOCX(dataset: DatasetListingModel): void {
|
||||||
|
this.datasetWizardService.downloadDOCX(dataset.id as string)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/msword' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadXML(dataset: DatasetListingModel): void {
|
||||||
|
this.datasetWizardService.downloadXML(dataset.id as string)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/xml' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getFilenameFromContentDispositionHeader(header: string): string {
|
||||||
|
const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g);
|
||||||
|
|
||||||
|
const matches = header.match(regex);
|
||||||
|
let filename: string;
|
||||||
|
for (let i = 0; i < matches.length; i++) {
|
||||||
|
const match = matches[i];
|
||||||
|
if (match.includes('filename="')) {
|
||||||
|
filename = match.substring(10, match.length - 1);
|
||||||
|
break;
|
||||||
|
} else if (match.includes('filename=')) {
|
||||||
|
filename = match.substring(9);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
public loadMore() {
|
||||||
|
const fields: Array<string> = ["-modified"];
|
||||||
|
const request = new DataTableRequest<DatasetCriteria>(this.startIndex, this.pageSize, { fields: fields });
|
||||||
|
|
||||||
|
request.criteria = new DatasetCriteria();
|
||||||
|
request.criteria.like = "";
|
||||||
|
|
||||||
|
this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (!result) { return []; }
|
||||||
|
this.datasetDrafts = this.datasetDrafts.concat(result.data);
|
||||||
|
});
|
||||||
|
this.startIndex = this.startIndex + this.pageSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,9 @@
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- if dataset -->
|
<!-- if dataset -->
|
||||||
|
|
|
@ -19,9 +19,11 @@
|
||||||
<span class="col">{{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}</span>
|
<span class="col">{{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex flex-direction-row pt-3 pb-3">
|
<div class="d-flex flex-direction-row pt-3 pb-3">
|
||||||
<div class="col-auto dataset-subtitle">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}</div>
|
<div class="col-auto dataset-subtitle">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
|
||||||
<div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
<div class="col-auto dmp-label ml-4">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
||||||
<div class="col-auto dmp-title">{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{activity.dmp}}</div>
|
</div>
|
||||||
|
<!-- <div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div> -->
|
||||||
|
<div class="col dmp-title">{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{activity.dmp}}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="dataset-card-actions">
|
<div class="dataset-card-actions">
|
||||||
|
@ -59,5 +61,8 @@
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
|
||||||
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
||||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
||||||
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
||||||
|
@ -28,7 +28,12 @@ import { DatasetStatus } from '@app/core/common/enum/dataset-status';
|
||||||
})
|
})
|
||||||
export class RecentEditedDatasetActivityComponent extends BaseComponent implements OnInit {
|
export class RecentEditedDatasetActivityComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
|
@Output() totalCountDatasets: EventEmitter<any> = new EventEmitter();
|
||||||
|
|
||||||
datasetActivities: DatasetListingModel[];
|
datasetActivities: DatasetListingModel[];
|
||||||
|
totalCount: number;
|
||||||
|
startIndex: number = 4;
|
||||||
|
pageSize: number = 5;
|
||||||
// publicMode = false;
|
// publicMode = false;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
@ -47,17 +52,33 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
if (this.isAuthenticated()) {
|
if (this.isAuthenticated()) {
|
||||||
const fields: Array<string> = ["-modified"];
|
const fields: Array<string> = ["-modified"];
|
||||||
const datasetDataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(0, 5, { fields: fields });
|
const datasetDataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(0, this.pageSize, { fields: fields });
|
||||||
datasetDataTableRequest.criteria = new DatasetCriteria();
|
datasetDataTableRequest.criteria = new DatasetCriteria();
|
||||||
datasetDataTableRequest.criteria.like = "";
|
datasetDataTableRequest.criteria.like = "";
|
||||||
this.datasetService
|
this.datasetService
|
||||||
.getPaged(datasetDataTableRequest)
|
.getPaged(datasetDataTableRequest)
|
||||||
.subscribe(response => {
|
.subscribe(response => {
|
||||||
this.datasetActivities = response.data;
|
this.datasetActivities = response.data;
|
||||||
|
this.totalCount = response.totalCount;
|
||||||
|
this.totalCountDatasets.emit(this.totalCount);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public loadMore() {
|
||||||
|
const fields: Array<string> = ["-modified"];
|
||||||
|
const request = new DataTableRequest<DatasetCriteria>(this.startIndex, this.pageSize, { fields: fields });
|
||||||
|
|
||||||
|
request.criteria = new DatasetCriteria();
|
||||||
|
request.criteria.like = "";
|
||||||
|
|
||||||
|
this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (!result) { return []; }
|
||||||
|
this.datasetActivities = this.datasetActivities.concat(result.data);
|
||||||
|
});
|
||||||
|
this.startIndex = this.startIndex + this.pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
public isAuthenticated(): boolean {
|
||||||
return !!this.authentication.current();
|
return !!this.authentication.current();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,243 @@
|
||||||
|
.latest-activity-title {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 300;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1.25rem;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.6;
|
||||||
|
padding-bottom: 1.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-card,
|
||||||
|
.dataset-card {
|
||||||
|
min-width: 712px;
|
||||||
|
/* min-height: 308px; */
|
||||||
|
background: #ffffff 0% 0% no-repeat padding-box;
|
||||||
|
box-shadow: 0px 3px 6px #0000001a;
|
||||||
|
border-radius: 4px;
|
||||||
|
opacity: 1;
|
||||||
|
margin-top: 2.43rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-border-bottom ::ng-deep .mat-tab-header {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
background: #fafafa 0% 0% no-repeat padding-box;
|
||||||
|
border: 1px solid #d1d1d1;
|
||||||
|
border-radius: 4px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 347px;
|
||||||
|
height: 56px;
|
||||||
|
font-family: Arial, FontAwesome;
|
||||||
|
padding-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edited-date {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 300;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
line-height: 2.4;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-label {
|
||||||
|
background: #129d99 0% 0% no-repeat padding-box;
|
||||||
|
border-radius: 4px 0px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 67px;
|
||||||
|
height: 37px;
|
||||||
|
color: #ffffff;
|
||||||
|
line-height: 2.4;
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-label {
|
||||||
|
width: 158px;
|
||||||
|
height: 37px;
|
||||||
|
background: #f7dd72 0% 0% no-repeat padding-box;
|
||||||
|
border-radius: 4px 0px;
|
||||||
|
text-align: left;
|
||||||
|
line-height: 2.8;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
letter-spacing: 0px;
|
||||||
|
color: #212121;
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-title,
|
||||||
|
.dataset-title {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.81;
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.55rem;
|
||||||
|
color: #212121;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-subtitle,
|
||||||
|
.dmp-subtitle {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 400;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
opacity: 1;
|
||||||
|
align-items: center;
|
||||||
|
color: #848484;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-title-draft {
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: "Roboto", sans-serif;
|
||||||
|
font-size: 1rem;
|
||||||
|
opacity: 0.81;
|
||||||
|
padding-top: 0.75rem;
|
||||||
|
padding-bottom: 0.55rem;
|
||||||
|
color: #f16868;
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-align {
|
||||||
|
display: inline-flex;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-bottom: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions,
|
||||||
|
.dmp-card-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
border-top: 1px solid #dbdbdb;
|
||||||
|
line-height: 4;
|
||||||
|
color: #848484;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions a,
|
||||||
|
.dmp-card-actions a {
|
||||||
|
color: #848484 !important;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dataset-card-actions a:hover,
|
||||||
|
.dmp-card-actions a:hover {
|
||||||
|
color: #129d99 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-dataset-descriptions-title {
|
||||||
|
color: #000000;
|
||||||
|
opacity: 0.6;
|
||||||
|
padding-top: 1.5rem;
|
||||||
|
padding-bottom: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dmp-dataset-descriptions-name {
|
||||||
|
color: #000000;
|
||||||
|
opacity: 0.6;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-more {
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.show-more:hover {
|
||||||
|
color: #129d99 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-load-more {
|
||||||
|
border: 2px solid #212121;
|
||||||
|
border-radius: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 132px;
|
||||||
|
height: 40px;
|
||||||
|
margin-top: 4.125rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-load-more:hover {
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.draft {
|
||||||
|
color: #f16868;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pointer {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* th {
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #212529;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-row {
|
||||||
|
cursor: pointer;
|
||||||
|
display: table-row;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-public {
|
||||||
|
padding-left: 5px;
|
||||||
|
padding-right: 5px;
|
||||||
|
border: 1px solid #00b29f3b;
|
||||||
|
color: #00b29f;
|
||||||
|
background-color: #00b29f0f;
|
||||||
|
border-radius: 10em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.template-name {
|
||||||
|
padding-left: 0.5em;
|
||||||
|
border: 1px solid rgb(218, 227, 243);
|
||||||
|
color: rgb(43, 104, 209);
|
||||||
|
background-color: rgb(236, 241, 249);
|
||||||
|
border-radius: 10em;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 160px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chip {
|
||||||
|
padding: 0.1em 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
margin-left: 2.5em;
|
||||||
|
margin-right: 2.5em;
|
||||||
|
border-radius: 10em;
|
||||||
|
background-color: #0d7489;
|
||||||
|
color: #fff;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 500;
|
||||||
|
max-width: 160px;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-icon-button :hover {
|
||||||
|
color: rgb(120, 173, 220);
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-all {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-bottom: 0px !important;
|
||||||
|
color: #6aa4d9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-all:hover {
|
||||||
|
color: rgb(46, 117, 182) !important;
|
||||||
|
} */
|
|
@ -0,0 +1,208 @@
|
||||||
|
<div *ngIf="dmpActivities != null">
|
||||||
|
<div *ngFor="let activity of dmpActivities">
|
||||||
|
<!-- if dmp -->
|
||||||
|
<div class="dmp-card">
|
||||||
|
<div [routerLink]="['../plans/overview/' + activity.id]" class="pointer">
|
||||||
|
<div class="d-flex flex-direction-row">
|
||||||
|
<div class="col-auto dmp-label">{{ 'DMP-LISTING.DMP' | translate }}</div>
|
||||||
|
<div class="col-auto ml-auto edited-date">{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modifiedTime | date: "longDate" }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto" [ngClass]="{'dmp-title': !isDraft, 'dmp-title-draft': isDraft}">{{activity.label}}</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-DATASETS' | translate}}: ({{activity.datasets.length}})
|
||||||
|
</div>
|
||||||
|
<div *ngFor="let dataset of activity.datasets; 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">{{dataset.label}},</div>
|
||||||
|
<div class="col-auto dmp-dataset-descriptions-name" *ngIf="last">{{dataset.label}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="d-flex justify-content-center pb-3 show-more" *ngIf="activity.datasets.length > 3" [routerLink]="['../plans/overview/' + activity.id]"><u>{{'GENERAL.ACTIONS.SHOW-MORE' | translate}}</u></a>
|
||||||
|
</div>
|
||||||
|
<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" (click)="addDataset(activity.id)"><span class="material-icons icon-align">add</span>{{'DMP-LISTING.ACTIONS.ADD-DATASET-SHORT' | translate}}</a>
|
||||||
|
<a class="col-auto border-right pointer" (click)="openShareDialog(activity.id, activity.label)"><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" (click)="cloneClicked(activity)"><span class="material-icons icon-align pr-2">filter_none</span>{{'DMP-LISTING.ACTIONS.CLONE' | translate}}</a>
|
||||||
|
<a class="col-auto pointer" [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)="newVersion(activity.id, activity.label)">
|
||||||
|
<mat-icon>queue</mat-icon>{{'DMP-LISTING.ACTIONS.NEW-VERSION' | translate}}
|
||||||
|
</button>
|
||||||
|
<button mat-menu-item (click)="viewVersions(activity.groupId, activity.label)">
|
||||||
|
<mat-icon>library_books</mat-icon>{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}}
|
||||||
|
</button>
|
||||||
|
<button mat-menu-item *ngIf="isDraftDmp(activity) && isUserOwner(activity)" (click)="deleteClicked()" class="menu-item">
|
||||||
|
<mat-icon>delete</mat-icon>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}
|
||||||
|
</button>
|
||||||
|
</mat-menu>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more" (click)="loadMore()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- if dataset -->
|
||||||
|
<!-- <div *ngIf="true" class="dataset-card">
|
||||||
|
<div class="d-flex flex-direction-row">
|
||||||
|
<div class="col-auto dataset-label">Dataset Description</div>
|
||||||
|
<div class="col-auto ml-auto edited-date">Edited: 9 May 2020</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto dataset-title">Dataset description: Horizon 2020 for Grant DMP of
|
||||||
|
Dataset description</div>
|
||||||
|
<div class="dataset-subtitle">
|
||||||
|
<span class="col-auto">Owner</span>
|
||||||
|
<span>.</span>
|
||||||
|
<span class="col-auto"><span class="material-icons icon-align">done</span>Finalized</span>
|
||||||
|
<span>.</span>
|
||||||
|
<span class="col-auto">Grant: NEANIAS Project</span>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex flex-direction-row pt-3 pb-3">
|
||||||
|
<div class="col-auto dataset-subtitle">Part of</div>
|
||||||
|
<div class="col-auto dmp-label">DMP</div>
|
||||||
|
<div class="col-auto dmp-title">DMP for: Horizon 2020 for Grant DMP of the NEANIAS
|
||||||
|
DMP plan</div>
|
||||||
|
</div>
|
||||||
|
<div class="dataset-card-actions">
|
||||||
|
<a href="#" class="col-auto border-right"><span class="material-icons icon-align pr-2">open_in_new</span>Export</a>
|
||||||
|
<a href="#" class="col-auto border-right"><span class="material-icons icon-align pr-2">group_add</span>Invite
|
||||||
|
collaborators</a>
|
||||||
|
<a href="#" class="col-auto"><span class="material-icons icon-align pl-2">more_horiz</span></a>
|
||||||
|
</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> -->
|
|
@ -0,0 +1,328 @@
|
||||||
|
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
|
||||||
|
import { MatDialog } from '@angular/material';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
||||||
|
import { Principal } from '@app/core/model/auth/principal';
|
||||||
|
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
||||||
|
import { DmpListingModel } from '@app/core/model/dmp/dmp-listing';
|
||||||
|
import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria';
|
||||||
|
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||||
|
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
||||||
|
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
||||||
|
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
||||||
|
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||||
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
import * as FileSaver from 'file-saver';
|
||||||
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component';
|
||||||
|
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
||||||
|
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
||||||
|
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
||||||
|
import { Role } from '@app/core/common/enum/role';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-recent-edited-dmp-activity',
|
||||||
|
templateUrl: './recent-edited-dmp-activity.component.html',
|
||||||
|
styleUrls: ['./recent-edited-dmp-activity.component.css']
|
||||||
|
})
|
||||||
|
export class RecentEditedDmpActivityComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
|
@Output() totalCountDmps: EventEmitter<any> = new EventEmitter();
|
||||||
|
|
||||||
|
dmpActivities: DmpListingModel[];
|
||||||
|
datasetActivities: DatasetListingModel[];
|
||||||
|
// allRecentActivities: RecentActivity[] = [];
|
||||||
|
recentActivityTypeEnum = RecentActivityType;
|
||||||
|
isDraft: boolean;
|
||||||
|
|
||||||
|
totalCount: number;
|
||||||
|
startIndex: number = 4;
|
||||||
|
pageSize: number = 5;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private router: Router,
|
||||||
|
public enumUtils: EnumUtils,
|
||||||
|
private authentication: AuthService,
|
||||||
|
private dmpService: DmpService,
|
||||||
|
private datasetService: DatasetService,
|
||||||
|
private language: TranslateService,
|
||||||
|
private dialog: MatDialog,
|
||||||
|
private uiNotificationService: UiNotificationService
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
if (this.isAuthenticated()) {
|
||||||
|
const fields: Array<string> = ["-modified"];
|
||||||
|
const dmpDataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(0, 5, { fields: fields });
|
||||||
|
dmpDataTableRequest.criteria = new DmpCriteria();
|
||||||
|
dmpDataTableRequest.criteria.like = "";
|
||||||
|
this.dmpService
|
||||||
|
.getPaged(dmpDataTableRequest, "listing")
|
||||||
|
.subscribe(response => {
|
||||||
|
this.dmpActivities = response.data;
|
||||||
|
this.totalCount = response.totalCount;
|
||||||
|
this.totalCountDmps.emit(this.totalCount);
|
||||||
|
// this.dmpActivities.forEach(dmpActivity => {
|
||||||
|
// const recentActivity: RecentActivity = {
|
||||||
|
// activityData: dmpActivity,
|
||||||
|
// activityType: RecentActivityType.Dmp
|
||||||
|
// };
|
||||||
|
// this.allRecentActivities.push(recentActivity)
|
||||||
|
// })
|
||||||
|
});
|
||||||
|
|
||||||
|
// const datasetDataTableRequest: DataTableRequest<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 isAuthenticated(): boolean {
|
||||||
|
return !!this.authentication.current();
|
||||||
|
}
|
||||||
|
|
||||||
|
isUserOwner(activity: DmpListingModel): boolean {
|
||||||
|
const principal: Principal = this.authentication.current();
|
||||||
|
if (principal) return principal.id === activity.users.find(x => x.role === Role.Owner).id;
|
||||||
|
}
|
||||||
|
|
||||||
|
editClicked(dmp: DmpListingModel) {
|
||||||
|
this.router.navigate(['/plans/edit/' + dmp.id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
cloneClicked(dmp: DmpListingModel) {
|
||||||
|
this.router.navigate(['/plans/clone/' + dmp.id]);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteClicked(dmp: DmpListingModel) {
|
||||||
|
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
||||||
|
maxWidth: '300px',
|
||||||
|
restoreFocus: false,
|
||||||
|
data: {
|
||||||
|
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'),
|
||||||
|
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'),
|
||||||
|
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
|
||||||
|
isDeleteConfirmation: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (result) {
|
||||||
|
this.dmpService.delete(dmp.id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(
|
||||||
|
complete => { this.onCallbackSuccess() },
|
||||||
|
error => this.onDeleteCallbackError(error)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
openShareDialog(rowId: any, rowName: any) {
|
||||||
|
const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
|
||||||
|
// height: '250px',
|
||||||
|
// width: '700px',
|
||||||
|
restoreFocus: false,
|
||||||
|
data: {
|
||||||
|
dmpId: rowId,
|
||||||
|
dmpName: rowName
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
isDraftDmp(activity: DmpListingModel) {
|
||||||
|
return activity.status == DmpStatus.Draft;
|
||||||
|
}
|
||||||
|
|
||||||
|
onCallbackSuccess(): void {
|
||||||
|
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
||||||
|
this.router.navigate(['/plans']);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDeleteCallbackError(error) {
|
||||||
|
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
redirect(id: string, type: RecentActivityType) {
|
||||||
|
switch (type) {
|
||||||
|
case RecentActivityType.Grant: {
|
||||||
|
this.router.navigate(["grants/edit/" + id]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case RecentActivityType.Dataset: {
|
||||||
|
this.router.navigate(["datasets/edit/" + id]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case RecentActivityType.Dmp: {
|
||||||
|
this.router.navigate(["plans/overview/" + id]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new Error("Unsupported Activity Type ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// navigateToUrl() {
|
||||||
|
// this.router.navigate(["plans/"]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
roleDisplay(value: any) {
|
||||||
|
const principal: Principal = this.authentication.current();
|
||||||
|
let role: number;
|
||||||
|
if (principal) {
|
||||||
|
value.forEach(element => {
|
||||||
|
if (principal.id === element.id) {
|
||||||
|
role = element.role;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (role === 0) {
|
||||||
|
return this.language.instant('DMP-LISTING.OWNER');
|
||||||
|
}
|
||||||
|
else if (role === 1) {
|
||||||
|
return this.language.instant('DMP-LISTING.MEMBER');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this.language.instant('DMP-LISTING.OWNER');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// dmpProfileDisplay(value: any) {
|
||||||
|
// if (value != null) {
|
||||||
|
// return value;
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// return "--";
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
downloadXml(id: string) {
|
||||||
|
this.dmpService.downloadXML(id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/xml' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadDocx(id: string) {
|
||||||
|
this.dmpService.downloadDocx(id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/msword' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadPDF(id: string) {
|
||||||
|
this.dmpService.downloadPDF(id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/pdf' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
downloadJson(id: string) {
|
||||||
|
this.dmpService.downloadJson(id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
const blob = new Blob([response.body], { type: 'application/json' });
|
||||||
|
const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
||||||
|
FileSaver.saveAs(blob, filename);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getFilenameFromContentDispositionHeader(header: string): string {
|
||||||
|
const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g);
|
||||||
|
|
||||||
|
const matches = header.match(regex);
|
||||||
|
let filename: string;
|
||||||
|
for (let i = 0; i < matches.length; i++) {
|
||||||
|
const match = matches[i];
|
||||||
|
if (match.includes('filename="')) {
|
||||||
|
filename = match.substring(10, match.length - 1);
|
||||||
|
break;
|
||||||
|
} else if (match.includes('filename=')) {
|
||||||
|
filename = match.substring(9);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
|
addDataset(activityId: String) {
|
||||||
|
this.router.navigate(['/datasets/new/' + activityId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
newVersion(id: String, label: String) {
|
||||||
|
this.router.navigate(['/plans/new_version/' + id, { dmpLabel: label }]);
|
||||||
|
}
|
||||||
|
|
||||||
|
viewVersions(rowId: String, rowLabel: String, activity: DmpListingModel) {
|
||||||
|
if (activity.public && !this.isUserOwner) {
|
||||||
|
this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
||||||
|
} else {
|
||||||
|
this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public loadMore() {
|
||||||
|
const fields: Array<string> = ["-modified"];
|
||||||
|
const request = new DataTableRequest<DmpCriteria>(this.startIndex, this.pageSize, { fields: fields });
|
||||||
|
|
||||||
|
request.criteria = new DmpCriteria();
|
||||||
|
request.criteria.like = "";
|
||||||
|
|
||||||
|
this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (!result) { return []; }
|
||||||
|
this.dmpActivities = this.dmpActivities.concat(result.data);
|
||||||
|
});
|
||||||
|
this.startIndex = this.startIndex + this.pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// advancedClicked(dmp: DmpListingModel) {
|
||||||
|
// const dialogRef = this.dialog.open(ExportMethodDialogComponent, {
|
||||||
|
// maxWidth: '500px',
|
||||||
|
// data: {
|
||||||
|
// message: "Download as:",
|
||||||
|
// XMLButton: "XML",
|
||||||
|
// documentButton: "Document",
|
||||||
|
// pdfButton: "PDF",
|
||||||
|
// jsonButton: "JSON"
|
||||||
|
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
// if (result == "pdf") {
|
||||||
|
// this.downloadPDF(dmp.id);
|
||||||
|
// } else if (result == "xml") {
|
||||||
|
// this.downloadXml(dmp.id);
|
||||||
|
// } else if (result == "doc") {
|
||||||
|
// this.downloadDocx(dmp.id);
|
||||||
|
// } else if (result == "json") {
|
||||||
|
// this.downloadJson(dmp.id)
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
}
|
Loading…
Reference in New Issue