argos/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts

842 lines
28 KiB
TypeScript
Raw Normal View History

2019-09-23 10:17:03 +02:00
import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { ActivatedRoute, Params, Router } from '@angular/router';
import { DatasetStatus } from '@app/core/common/enum/dataset-status';
import { DmpStatus } from '@app/core/common/enum/dmp-status';
2020-04-27 15:21:03 +02:00
import { Principal } from '@app/core/model/auth/principal';
import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview';
import { DatasetsToBeFinalized } from '@app/core/model/dataset/datasets-toBeFinalized';
import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview';
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
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 { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
import { DmpFinalizeDialogComponent, DmpFinalizeDialogInput, DmpFinalizeDialogOutput } from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component';
import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item';
import { BaseComponent } from '@common/base/base.component';
2019-05-21 15:42:28 +02:00
import { TranslateService } from '@ngx-translate/core';
import * as FileSaver from 'file-saver';
import { Observable, of as observableOf, interval } from 'rxjs';
2020-09-03 11:52:35 +02:00
import { takeUntil, map } from 'rxjs/operators';
import { Role } from "@app/core/common/enum/role";
import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component';
import { MultipleChoiceDialogModule } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.module';
import { MultipleChoiceDialogComponent } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.component';
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
import { Oauth2DialogComponent } from '@app/ui/misc/oauth2-dialog/oauth2-dialog.component';
import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service';
import { isNullOrUndefined } from 'util';
import { UserService } from '@app/core/services/user/user.service';
2020-06-30 17:33:01 +02:00
import { Location } from '@angular/common';
2020-09-03 11:52:35 +02:00
import { FormGroup, FormArray, FormControl } from '@angular/forms';
2020-07-01 17:32:22 +02:00
import { LockService } from '@app/core/services/lock/lock.service';
import { ReturnStatement, ConditionalExpr } from '@angular/compiler';
2020-07-01 17:32:22 +02:00
import { LockModel } from '@app/core/model/lock/lock.model';
import { Guid } from '@common/types/guid';
2020-07-09 13:28:55 +02:00
import { VersionListingModel } from '@app/core/model/version/version-listing.model';
2020-09-03 11:52:35 +02:00
import { CloneDialogComponent } from '../clone/clone-dialog/clone-dialog.component';
import { DmpModel } from '@app/core/model/dmp/dmp';
import { DmpEditorModel } from '../editor/dmp-editor.model';
import { FunderFormModel } from '../editor/grant-tab/funder-form-model';
import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties-form.model';
2020-09-18 13:14:48 +02:00
import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model';
import { StartNewDatasetDialogComponent } from '../start-new-dataset-dialogue/start-new-dataset-dialog.component';
import { StartNewDmpDialogComponent } from '../start-new-dmp-dialogue/start-new-dmp-dialog.component';
import { HttpClient } from '@angular/common/http';
import { MatomoService } from '@app/core/services/matomo/matomo-service';
2019-05-21 15:42:28 +02:00
@Component({
selector: 'app-dmp-overview',
templateUrl: './dmp-overview.component.html',
styleUrls: ['./dmp-overview.component.scss']
})
export class DmpOverviewComponent extends BaseComponent implements OnInit {
dmp: DmpOverviewModel;
2020-09-03 11:52:35 +02:00
dmpModel: DmpEditorModel;
2019-05-21 15:42:28 +02:00
isNew = true;
isFinalized = false;
isPublicView = true;
hasPublishButton: boolean = true;
2019-09-23 10:17:03 +02:00
breadCrumbs: Observable<BreadcrumbItem[]> = observableOf();
isUserOwner: boolean;
2020-03-03 10:20:27 +01:00
expand = false;
2020-04-10 16:16:37 +02:00
hasDOIToken = false;
2020-07-01 17:32:22 +02:00
lockStatus: Boolean;
textMessage: any;
2020-07-09 13:28:55 +02:00
versions: VersionListingModel[];
version: VersionListingModel;
private oauthLock: boolean;
@ViewChild('doi', { static: false })
doi: ElementRef;
2020-07-01 17:32:22 +02:00
2020-09-03 11:52:35 +02:00
formGroup: FormGroup;
2019-05-21 15:42:28 +02:00
constructor(
private route: ActivatedRoute,
private router: Router,
private dmpService: DmpService,
private translate: TranslateService,
private authentication: AuthService,
private dialog: MatDialog,
private language: TranslateService,
private uiNotificationService: UiNotificationService,
private configurationService: ConfigurationService,
private oauth2DialogService: Oauth2DialogService,
2020-06-30 17:33:01 +02:00
private userService: UserService,
2020-07-01 17:32:22 +02:00
private location: Location,
private lockService: LockService,
private httpClient: HttpClient,
private matomoService: MatomoService
2019-05-21 15:42:28 +02:00
) {
super();
}
ngOnInit() {
this.matomoService.trackPageView('DMP Overview');
2019-05-21 15:42:28 +02:00
// Gets dmp data using parameter id
this.route.params
.pipe(takeUntil(this._destroyed))
.subscribe((params: Params) => {
const itemId = params['id'];
const publicId = params['publicId'];
2019-05-21 15:42:28 +02:00
if (itemId != null) {
this.isNew = false;
this.isPublicView = false;
2019-05-21 15:42:28 +02:00
this.dmpService.getOverviewSingle(itemId)
.pipe(takeUntil(this._destroyed))
.subscribe(data => {
this.dmp = data;
this.checkLockStatus(this.dmp.id);
2020-02-18 17:41:56 +01:00
this.setIsUserOwner();
2020-07-09 13:28:55 +02:00
this.getAllVersions(this.dmp);
const breadCrumbs = [];
breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DMPS'), url: "/plans" });
breadCrumbs.push({ parentComponentName: 'DmpListingComponent', label: this.dmp.label, url: '/plans/overview/' + this.dmp.id });
2019-09-23 10:17:03 +02:00
this.breadCrumbs = observableOf(breadCrumbs);
}, (error: any) => {
if (error.status === 404) {
return this.onFetchingDeletedCallbackError('/plans/');
}
if (error.status === 403) {
return this.onFetchingForbiddenCallbackError('/plans/');
}
});
2019-05-21 15:42:28 +02:00
}
else if (publicId != null) {
this.isNew = false;
this.isFinalized = true;
this.isPublicView = true;
this.dmpService.getOverviewSinglePublic(publicId)
.pipe(takeUntil(this._destroyed))
.subscribe(data => {
this.dmp = data;
2020-08-03 10:40:38 +02:00
// this.checkLockStatus(this.dmp.id);
2020-07-09 13:28:55 +02:00
this.getAllVersions(this.dmp);
const breadCrumbs = [];
breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.PUBLIC-DMPS'), url: "/explore-plans" });
breadCrumbs.push({ parentComponentName: 'DmpListingComponent', label: this.dmp.label, url: '/plans/publicOverview/' + this.dmp.id });
2019-09-23 10:17:03 +02:00
this.breadCrumbs = observableOf(breadCrumbs);
}, (error: any) => {
if (error.status === 404) {
return this.onFetchingDeletedCallbackError('/explore-plans');
}
if (error.status === 403) {
return this.onFetchingForbiddenCallbackError('/explore-plans');
}
});
}
2019-05-21 15:42:28 +02:00
});
}
onFetchingDeletedCallbackError(redirectRoot: string) {
this.uiNotificationService.snackBarNotification(this.language.instant('DMP-OVERVIEW.ERROR.DELETED-DMP'), SnackBarNotificationLevel.Error);
this.router.navigate([redirectRoot]);
}
onFetchingForbiddenCallbackError(redirectRoot: string) {
this.uiNotificationService.snackBarNotification(this.language.instant('DMP-OVERVIEW.ERROR.FORBIDEN-DMP'), SnackBarNotificationLevel.Error);
this.router.navigate([redirectRoot]);
}
2020-02-18 17:41:56 +01:00
setIsUserOwner() {
if (this.dmp) {
const principal: Principal = this.authentication.current();
if (principal) this.isUserOwner = !!this.dmp.users.find(x => (x.role === Role.Owner) && (principal.id === x.id));
}
}
isUserAuthor(userId: string): boolean {
2020-08-03 10:40:38 +02:00
if (this.isAuthenticated()) {
const principal: Principal = this.authentication.current();
return userId === principal.id;
} else return false;
}
2019-05-21 15:42:28 +02:00
editClicked(dmp: DmpOverviewModel) {
this.router.navigate(['/plans/edit/', dmp.id]);
// let url = this.router.createUrlTree(['/plans/edit/', dmp.id]);
// window.open(url.toString(), '_blank');
2019-05-21 15:42:28 +02:00
}
2020-09-03 17:49:45 +02:00
cloneOrNewVersionClicked(dmp: DmpOverviewModel, isNewVersion: boolean) {
2020-09-03 11:52:35 +02:00
this.dmpService.getSingle(this.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.formGroup = this.dmpModel.buildForm();
2020-09-03 17:49:45 +02:00
if (!isNewVersion) {
this.formGroup.get('label').setValue(this.dmp.label + " New");
}
this.openCloneDialog(isNewVersion);
2020-09-03 11:52:35 +02:00
});
}
2020-09-03 17:49:45 +02:00
openCloneDialog(isNewVersion: boolean) {
2020-09-03 11:52:35 +02:00
const dialogRef = this.dialog.open(CloneDialogComponent, {
2020-09-03 17:49:45 +02:00
maxWidth: '900px',
maxHeight: '80vh',
2020-09-03 11:52:35 +02:00
data: {
formGroup: this.formGroup,
datasets: this.dmp.datasets,
2020-09-03 17:49:45 +02:00
isNewVersion: isNewVersion,
confirmButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.SAVE'),
2020-09-03 11:52:35 +02:00
cancelButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.CANCEL'),
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
2020-09-03 17:49:45 +02:00
if (!isNewVersion) {
this.dmpService.clone(this.formGroup.getRawValue(), this.dmp.id)
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => this.onCallbackSuccess(complete),
error => this.onCallbackError(error)
);
} else if (isNewVersion) {
this.dmpService.newVersion(this.formGroup.getRawValue(), this.dmp.id)
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => this.onCallbackSuccess(complete),
error => this.onCallbackError(error)
);
}
2020-09-03 11:52:35 +02:00
}
});
}
2020-09-03 17:49:45 +02:00
onCallbackSuccess(dmpId: String): void {
2020-09-03 11:52:35 +02:00
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
2020-09-03 17:49:45 +02:00
this.router.navigate(['/plans/edit/', dmpId]);
2020-09-03 11:52:35 +02:00
}
onCallbackError(error: any) {
2020-09-03 17:49:45 +02:00
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Error);
2019-05-21 15:42:28 +02:00
}
2019-10-04 10:53:30 +02:00
grantClicked(grantId: String) {
// ----------- UNCOMMENT TO ADD AGAIN GRANTS --------
// this.router.navigate(['/grants/edit/' + grantId]);
}
2019-05-21 15:42:28 +02:00
2020-03-03 10:20:27 +01:00
expandDesc() {
this.expand = !this.expand;
}
2020-04-10 16:16:37 +02:00
checkOverflow(element) {
2020-03-03 10:20:27 +01:00
if (this.expand || (element.offsetHeight < element.scrollHeight ||
element.offsetWidth < element.scrollWidth)) {
2020-04-10 16:16:37 +02:00
return true;
2020-03-03 10:20:27 +01:00
} else {
2020-04-10 16:16:37 +02:00
return false;
2020-03-03 10:20:27 +01:00
}
2020-04-10 16:16:37 +02:00
}
2020-03-03 10:20:27 +01:00
2019-05-21 15:42:28 +02:00
datasetClicked(datasetId: String) {
2020-07-06 12:21:11 +02:00
// if (this.isPublicView) {
// this.router.navigate(['/datasets/publicEdit/' + datasetId]);
// } else {
// this.router.navigate(['/datasets/edit/' + datasetId]);
// }
this.router.navigate(['/datasets/overview/' + datasetId]);
2019-05-21 15:42:28 +02:00
}
datasetsClicked(dmpId: String) {
if (!this.isFinalized)
this.router.navigate(['/plans/edit/' + dmpId], { queryParams: { tab: "datasetDescriptions" } });
else
this.router.navigate(['/explore'], { queryParams: { dmpId: dmpId } });
2019-05-21 15:42:28 +02:00
}
goToUri(uri: string) {
2019-05-21 15:42:28 +02:00
window.open(uri, "_blank");
}
deleteClicked() {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
maxWidth: '300px',
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'),
2019-05-22 15:36:24 +02:00
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
isDeleteConfirmation: true
2019-05-21 15:42:28 +02:00
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.dmpService.delete(this.dmp.id)
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => { this.onDeleteCallbackSuccess() },
error => this.onDeleteCallbackError(error)
2019-05-21 15:42:28 +02:00
);
}
});
}
onDeleteCallbackSuccess(): void {
2020-07-22 13:26:49 +02:00
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
2019-05-21 15:42:28 +02:00
this.router.navigate(['/plans']);
}
onDeleteCallbackError(error) {
this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
2019-05-21 15:42:28 +02:00
}
onUpdateCallbackSuccess(): void {
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
this.reloadPage();
}
onUpdateCallbackError(error) {
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Error);
}
2019-05-21 15:42:28 +02:00
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);
});
}
2019-06-04 16:55:23 +02:00
downloadJson(id: string) {
this.dmpService.downloadJson(id)
.pipe(takeUntil(this._destroyed))
.subscribe(complete => {
const blob = new Blob([complete.body], { type: 'application/json' });
const filename = this.getFilenameFromContentDispositionHeader(complete.headers.get('Content-Disposition'));
2019-06-04 16:55:23 +02:00
FileSaver.saveAs(blob, filename);
}, 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);
2019-06-04 16:55:23 +02:00
}
2019-05-21 15:42:28 +02:00
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;
}
roleDisplayFromList(value: UserInfoListingModel[]) {
2019-05-21 15:42:28 +02:00
const principal: Principal = this.authentication.current();
let role: number;
if (principal) {
value.forEach(element => {
if (principal.id === element.id) {
role = element.role;
}
});
}
2020-02-18 17:41:56 +01:00
if (role === Role.Owner) {
return this.translate.instant('DMP-LISTING.OWNER');
} else if (role === Role.Member) {
return this.translate.instant('DMP-LISTING.MEMBER');
} else {
return this.translate.instant('DMP-LISTING.OWNER');
2019-05-21 15:42:28 +02:00
}
}
isUserDMPRelated() {
const principal: Principal = this.authentication.current();
let isRelated: boolean = false;
if (this.dmp && principal) {
this.dmp.users.forEach(element => {
if (element.id === principal.id) {
isRelated = true;
}
})
}
return isRelated;
}
roleDisplay(value: UserInfoListingModel) {
2020-02-18 17:41:56 +01:00
if (value.role === Role.Owner) {
return this.translate.instant('DMP-LISTING.OWNER');
} else if (value.role === Role.Member) {
return this.translate.instant('DMP-LISTING.MEMBER');
} else {
return this.translate.instant('DMP-LISTING.OWNER');
2019-05-21 15:42:28 +02:00
}
}
isDraftDataset(dataset: DatasetOverviewModel) {
return dataset.status == DatasetStatus.Draft;
}
isDraftDmp(dmp: DmpOverviewModel) {
return dmp.status == DmpStatus.Draft;
}
isFinalizedDmp(dmp: DmpOverviewModel) {
return dmp.status == DmpStatus.Finalized;
}
isPublishedDMP(dmp: DmpOverviewModel) {
return (dmp.status == DmpStatus.Finalized && dmp.isPublic);
}
hasDoi(dmp: DmpOverviewModel) {
return dmp.doi == null ? true : false;
}
getAccessUrl(): string {
const redirectUri = this.configurationService.app + 'oauth2';
const url = this.configurationService.loginProviders.zenodoConfiguration.oauthUrl
2020-04-10 16:16:37 +02:00
+ '?client_id=' + this.configurationService.loginProviders.zenodoConfiguration.clientId
+ '&response_type=code&scope=deposit:write+deposit:actions+user:email&state=astate&redirect_uri='
+ redirectUri;
return url;
}
getDoi(dmp: DmpOverviewModel) {
this.userService.hasDOIToken().subscribe(response => {
2020-04-10 16:16:37 +02:00
this.hasDOIToken = true;
this.showConfirmationDOIDialog(dmp);
}, error => {
2020-04-10 16:16:37 +02:00
this.hasDOIToken = false;
this.showErrorConfirmationDOIDialog(error.error.message, dmp);
});
}
2020-07-09 13:28:55 +02:00
getAllVersions(dmp: DmpOverviewModel) {
this.dmpService.getAllVersions(dmp.groupId, this.isPublicView)
2020-07-09 13:28:55 +02:00
.pipe(takeUntil(this._destroyed))
.subscribe(items => {
this.versions = items;
});
}
2020-04-10 16:16:37 +02:00
showConfirmationDOIDialog(dmp: DmpOverviewModel) {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
maxWidth: '600px',
restoreFocus: false,
data: {
2020-04-27 15:21:03 +02:00
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ZENODO-DOI', { 'username': this.hasDOIToken ? this.authentication.current().zenodoEmail : 'default' }),
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.dmpService.getDoi(dmp.id)
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.onDOICallbackSuccess();
this.dmp.doi = complete;
},
error => this.onDeleteCallbackError(error)
);
}
});
}
showErrorConfirmationDOIDialog(message: string, dmp: DmpOverviewModel) {
const dialogRef = this.dialog.open(MultipleChoiceDialogComponent, {
maxWidth: '600px',
restoreFocus: false,
data: {
message: this.language.instant(message),
2020-04-10 16:16:37 +02:00
titles: [this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.ZENODO-LOGIN'), this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.USE-DEFAULT')]
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
switch (result) {
case 0:
// this.authentication.logout();
// this.router.navigate(['/login/external/zenodo']);
this.showOauth2Dialog(this.getAccessUrl(), dmp);
break;
case 1:
this.showConfirmationDOIDialog(dmp);
break;
}
});
}
showOauth2Dialog(url: string, dmp: DmpOverviewModel) {
this.oauth2DialogService.login(url)
2020-04-10 16:16:37 +02:00
.pipe(takeUntil(this._destroyed))
.subscribe(result => {
if (result !== undefined) {
if (result.oauthCode !== undefined && result.oauthCode !== null && !this.oauthLock) {
this.userService.registerDOIToken(result.oauthCode, this.configurationService.app + 'oauth2')
.pipe(takeUntil(this._destroyed))
.subscribe(() => {
this.hasDOIToken = true;
this.showConfirmationDOIDialog(dmp);
});
this.oauthLock = true;
}
} else {
this.oauthLock = false;
2020-04-10 16:16:37 +02:00
}
});
}
onDOICallbackSuccess(): void {
this.uiNotificationService.snackBarNotification(this.language.instant('DMP-EDITOR.SNACK-BAR.SUCCESSFUL-DOI'), SnackBarNotificationLevel.Success);
}
onDOICallbackError(error) {
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('DMP-EDITOR.SNACK-BAR.UNSUCCESSFUL-DOI'), SnackBarNotificationLevel.Error);
}
showPublishButton(dmp: DmpOverviewModel) {
return this.isFinalizedDmp(dmp) && !dmp.isPublic && this.hasPublishButton;
}
publish(dmpId: String) {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
2019-11-06 15:30:15 +01:00
maxWidth: '500px',
restoreFocus: false,
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PUBLISH-ITEM'),
privacyPolicyNames: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PRIVACY-POLICY-NAMES'),
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
isDeleteConfirmation: false
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.dmpService.publish(dmpId)
.pipe(takeUntil(this._destroyed))
.subscribe(() => {
this.hasPublishButton = false;
this.reloadPage();
});
}
});
}
finalize(dmp: DmpOverviewModel) {
const dialogInputModel: DmpFinalizeDialogInput = {
dmpLabel: this.dmp.label,
dmpDescription: this.dmp.description,
datasets: this.dmp.datasets.map(x => {
return { label: x.label, id: x.id, status: x.status }
})
}
const dialogRef = this.dialog.open(DmpFinalizeDialogComponent, {
maxWidth: '500px',
restoreFocus: false,
autoFocus: false,
data: {
dialogInputModel: dialogInputModel,
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.FINALIZE-ITEM'),
confirmButton: this.language.instant('DMP-FINALISE-DIALOG.SUBMIT'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: DmpFinalizeDialogOutput) => {
if (result && !result.cancelled) {
var datasetsToBeFinalized: DatasetsToBeFinalized = {
uuids: result.datasetsToBeFinalized
};
this.dmpService.finalize(datasetsToBeFinalized, this.dmp.id)
.pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.dmp.status = DmpStatus.Finalized;
this.onUpdateCallbackSuccess();
},
error => this.onUpdateCallbackError(error)
);
}
});
2019-05-21 15:42:28 +02:00
}
2020-09-03 17:49:45 +02:00
// 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) {
if (this.isPublicView) {
this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
} else {
this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
}
}
public isAuthenticated(): boolean {
return !(!this.authentication.current());
}
versionChanged(versionId: string): void {
if (this.isPublicView) {
this.router.navigate(['/explore-plans/publicOverview/' + versionId]);
} else {
this.router.navigate(['/plans/overview/' + versionId]);
}
}
openShareDialog(rowId: any, rowName: any) {
const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
// height: '250px',
// width: '700px',
autoFocus: false,
restoreFocus: false,
data: {
dmpId: rowId,
dmpName: rowName
}
});
}
2020-09-18 13:14:48 +02:00
openNewDmpDialog() {
if (this.dialog.openDialogs.length > 0) {
this.dialog.closeAll();
}
else {
const dialogRef = this.dialog.open(StartNewDmpDialogComponent, {
disableClose: false,
data: {
isDialog: true
}
});
}
}
// addDataset(rowId: String) {
// this.router.navigate(['/datasets/new/' + rowId]);
// }
addNewDataset() {
this.router.navigate(['/datasets', 'new', this.dmp.id]);
}
createDoiLink(doi: string): string {
const doiarr = doi.split('.');
const id = doiarr[doiarr.length - 1];
return this.configurationService.doiLink + id;
}
reverse() {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
restoreFocus: false,
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.UNFINALIZE-ITEM'),
confirmButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.AFFIRMATIVE'),
cancelButton: this.language.instant('QUICKWIZARD.SAVE-DIALOG.ACTIONS.NEGATIVE'),
isDeleteConfirmation: false
}
});
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
if (result) {
this.dmpService.unfinalize(this.dmp.id).pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.dmp.status = DmpStatus.Draft;
this.onUpdateCallbackSuccess()
},
error => this.onUpdateCallbackError(error)
);
}
});
}
2020-06-30 17:33:01 +02:00
goBack(): void {
this.location.back();
2020-07-01 17:32:22 +02:00
}
reloadPage(): void {
2020-07-22 13:26:49 +02:00
const path = this.location.path();
this.router.navigateByUrl('/reload', { skipLocationChange: true }).then(() => {
2020-07-22 13:26:49 +02:00
this.router.navigate([path]);
});
}
updateUsers() {
return this.dmpService.updateUsers(this.dmp.id, this.dmp.users).pipe(takeUntil(this._destroyed))
.subscribe(
complete => {
this.onUpdateCallbackSuccess();
},
error => this.onUpdateCallbackError(error)
);
}
removeUserFromDmp(user: UserInfoListingModel) {
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
data: {
message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-USER'),
confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.REMOVE'),
cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'),
isDeleteConfirmation: false
}
});
dialogRef.afterClosed().subscribe(result => {
if (result) {
2020-07-09 13:28:55 +02:00
const list = this.dmp.users;
const index = this.dmp.users.indexOf(user);
if (index > -1) {
this.dmp.users.splice(index, 1);
}
this.updateUsers();
}
});
2020-07-01 17:32:22 +02:00
}
2020-07-07 17:30:25 +02:00
copyDoi(doi) {
let domElement = doi.nativeElement as HTMLInputElement;
domElement.select();
document.execCommand('copy');
domElement.setSelectionRange(0, 0);
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-COPY-TO-CLIPBOARD'), SnackBarNotificationLevel.Success);
}
2020-07-07 17:30:25 +02:00
public getOrcidPath(): string {
return this.configurationService.orcidPath;
}
2020-07-01 17:32:22 +02:00
isOrcid(reference: string) {
const head = reference.split(':')[0];
return head === 'orcid';
}
getOrcidPathForResearcher(reference: string): string {
const path = this.getOrcidPath();
const userId = reference.split(':')[1];
return path + userId;
}
2020-07-07 17:30:25 +02:00
checkLockStatus(id: string) {
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
2020-07-07 17:30:25 +02:00
.subscribe(lockStatus => this.lockStatus = lockStatus);
2020-07-01 17:32:22 +02:00
}
getUserFromDMP(): any {
if (this.dmp) {
const principal: Principal = this.authentication.current();
return this.dmp.users.find(x => x.id === principal.id);
}
2020-07-01 17:32:22 +02:00
}
2020-06-30 17:33:01 +02:00
2020-07-09 13:28:55 +02:00
2020-07-07 17:30:25 +02:00
// advancedClicked() {
// 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(this.dmp.id);
// } else if (result == "xml") {
// this.downloadXml(this.dmp.id);
// } else if (result == "doc") {
// this.downloadDocx(this.dmp.id);
// } else if (result == "json") {
// this.downloadJson(this.dmp.id);
// }
// });
// }
// advancedClickedFinalized() {
// const dialogRef = this.dialog.open(ExportMethodDialogComponent, {
// maxWidth: '250px',
// data: {
// message: "Download as:",
// documentButton: "Document",
// pdfButton: "PDF",
// isFinalized: true
// }
// });
// dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
// if (result == "pdf") {
// this.downloadPDF(this.dmp.id);
// } else if (result == "doc") {
// this.downloadDocx(this.dmp.id);
// }
// });
// }
2019-05-21 15:42:28 +02:00
}