diff --git a/dmp-frontend/src/app/ui/dmp/dmp.module.ts b/dmp-frontend/src/app/ui/dmp/dmp.module.ts index 16867c162..d6060d4b1 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.module.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.module.ts @@ -1,56 +1,62 @@ -import { NgModule } from '@angular/core'; -import { FormattingModule } from '@app/core/formatting.module'; -import { AutoCompleteModule } from '@app/library/auto-complete/auto-complete.module'; -import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module'; -import { ExportMethodDialogModule } from '@app/library/export-method-dialog/export-method-dialog.module'; -import { UrlListingModule } from '@app/library/url-listing/url-listing.module'; -import { DmpCloneComponent } from '@app/ui/dmp/clone/dmp-clone.component'; -import { DmpRoutingModule } from '@app/ui/dmp/dmp.routing'; -import { AddResearcherComponent } from '@app/ui/dmp/editor/add-researcher/add-researcher.component'; -import { AvailableProfilesComponent } from '@app/ui/dmp/editor/available-profiles/available-profiles.component'; -import { DatasetsTabComponent } from '@app/ui/dmp/editor/datasets-tab/datasets-tab.component'; -import { DmpEditorComponent } from '@app/ui/dmp/editor/dmp-editor.component'; -import { DmpFinalizeDialogComponent } from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component'; -import { DynamicDmpFieldResolverComponent } from '@app/ui/dmp/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component'; -import { DynamicFieldGrantComponent } from '@app/ui/dmp/editor/dynamic-fields-grant/dynamic-field-grant/dynamic-field-grant.component'; -import { DynamicFieldsGrantComponent } from '@app/ui/dmp/editor/dynamic-fields-grant/dynamic-fields-grant.component'; -import { GeneralTabComponent } from '@app/ui/dmp/editor/general-tab/general-tab.component'; -import { GrantTabComponent } from '@app/ui/dmp/editor/grant-tab/grant-tab.component'; -import { PeopleTabComponent } from '@app/ui/dmp/editor/people-tab/people-tab.component'; -import { InvitationAcceptedComponent } from '@app/ui/dmp/invitation/accepted/dmp-invitation-accepted.component'; -import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; -import { DmpCriteriaComponent } from '@app/ui/dmp/listing/criteria/dmp-criteria.component'; -import { DmpUploadDialogue } from '@app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component'; -import { DmpListingComponent } from '@app/ui/dmp/listing/dmp-listing.component'; -import { DmpListingItemComponent } from '@app/ui/dmp/listing/listing-item/dmp-listing-item.component'; -import { DmpOverviewModule } from '@app/ui/dmp/overview/dmp-overview.module'; -import { DmpWizardComponent } from '@app/ui/dmp/wizard/dmp-wizard.component'; -import { DmpWizardEditorComponent } from '@app/ui/dmp/wizard/editor/dmp-wizard-editor.component'; -import { DmpWizardDatasetListingComponent } from '@app/ui/dmp/wizard/listing/dmp-wizard-dataset-listing.component'; -import { CommonFormsModule } from '@common/forms/common-forms.module'; -import { FormValidationErrorsDialogModule } from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.module'; -import { CommonUiModule } from '@common/ui/common-ui.module'; -import { MultipleChoiceDialogModule } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.module'; -import { AddOrganizationComponent } from './editor/add-organization/add-organization.component'; -import { AddCostComponent } from './editor/cost-editor/add-cost/add-cost.component'; -import { CostListingComponent } from './editor/cost-editor/cost-listing/cost-listing.component'; -import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dialog.component'; -import { StartNewDmpDialogComponent } from './start-new-dmp-dialogue/start-new-dmp-dialog.component'; -import { MainInfoComponent } from './editor/main-info/main-info.component'; -import { FundingInfoComponent } from './editor/funding-info/funding-info.component'; -import { DatasetInfoComponent } from './editor/dataset-info/dataset-info.component'; -import { DatasetEditorDetailsModule } from './editor/dataset-editor-details/dataset-editor-details.module'; -import { DatasetEditorDetailsComponent } from './editor/dataset-editor-details/dataset-editor-details.component'; -import { DatasetDescriptionFormModule } from '../misc/dataset-description-form/dataset-description-form.module'; -import { LicenseInfoComponent } from './editor/license-info/license-info.component'; -import { StartNewDatasetDialogComponent } from './start-new-dataset-dialogue/start-new-dataset-dialog.component'; -import { NgxDropzoneModule } from 'ngx-dropzone'; -import { DmpToDatasetDialogComponent } from './dmp-to-dataset/dmp-to-dataset-dialog.component'; -import { FormProgressIndicationComponent } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.component'; -import { FormProgressIndicationModule } from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.module'; -import { DatasetPreviewDialogComponent } from './dataset-preview/dataset-preview-dialog.component'; +import {NgModule} from '@angular/core'; +import {FormattingModule} from '@app/core/formatting.module'; +import {AutoCompleteModule} from '@app/library/auto-complete/auto-complete.module'; +import {ConfirmationDialogModule} from '@common/modules/confirmation-dialog/confirmation-dialog.module'; +import {ExportMethodDialogModule} from '@app/library/export-method-dialog/export-method-dialog.module'; +import {UrlListingModule} from '@app/library/url-listing/url-listing.module'; +import {DmpCloneComponent} from '@app/ui/dmp/clone/dmp-clone.component'; +import {DmpRoutingModule} from '@app/ui/dmp/dmp.routing'; +import {AddResearcherComponent} from '@app/ui/dmp/editor/add-researcher/add-researcher.component'; +import {AvailableProfilesComponent} from '@app/ui/dmp/editor/available-profiles/available-profiles.component'; +import {DatasetsTabComponent} from '@app/ui/dmp/editor/datasets-tab/datasets-tab.component'; +import {DmpEditorComponent} from '@app/ui/dmp/editor/dmp-editor.component'; +import {DmpFinalizeDialogComponent} from '@app/ui/dmp/editor/dmp-finalize-dialog/dmp-finalize-dialog.component'; +import { + DynamicDmpFieldResolverComponent +} from '@app/ui/dmp/editor/dynamic-field-resolver/dynamic-dmp-field-resolver.component'; +import { + DynamicFieldGrantComponent +} from '@app/ui/dmp/editor/dynamic-fields-grant/dynamic-field-grant/dynamic-field-grant.component'; +import {DynamicFieldsGrantComponent} from '@app/ui/dmp/editor/dynamic-fields-grant/dynamic-fields-grant.component'; +import {GeneralTabComponent} from '@app/ui/dmp/editor/general-tab/general-tab.component'; +import {GrantTabComponent} from '@app/ui/dmp/editor/grant-tab/grant-tab.component'; +import {PeopleTabComponent} from '@app/ui/dmp/editor/people-tab/people-tab.component'; +import {InvitationAcceptedComponent} from '@app/ui/dmp/invitation/accepted/dmp-invitation-accepted.component'; +import {DmpInvitationDialogComponent} from '@app/ui/dmp/invitation/dmp-invitation-dialog.component'; +import {DmpCriteriaComponent} from '@app/ui/dmp/listing/criteria/dmp-criteria.component'; +import {DmpUploadDialogue} from '@app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component'; +import {DmpListingComponent} from '@app/ui/dmp/listing/dmp-listing.component'; +import {DmpListingItemComponent} from '@app/ui/dmp/listing/listing-item/dmp-listing-item.component'; +import {DmpOverviewModule} from '@app/ui/dmp/overview/dmp-overview.module'; +import {DmpWizardComponent} from '@app/ui/dmp/wizard/dmp-wizard.component'; +import {DmpWizardEditorComponent} from '@app/ui/dmp/wizard/editor/dmp-wizard-editor.component'; +import {DmpWizardDatasetListingComponent} from '@app/ui/dmp/wizard/listing/dmp-wizard-dataset-listing.component'; +import {CommonFormsModule} from '@common/forms/common-forms.module'; +import { + FormValidationErrorsDialogModule +} from '@common/forms/form-validation-errors-dialog/form-validation-errors-dialog.module'; +import {CommonUiModule} from '@common/ui/common-ui.module'; +import {MultipleChoiceDialogModule} from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.module'; +import {AddOrganizationComponent} from './editor/add-organization/add-organization.component'; +import {AddCostComponent} from './editor/cost-editor/add-cost/add-cost.component'; +import {CostListingComponent} from './editor/cost-editor/cost-listing/cost-listing.component'; +import {DmpCriteriaDialogComponent} from './listing/criteria/dmp-criteria-dialog.component'; +import {StartNewDmpDialogComponent} from './start-new-dmp-dialogue/start-new-dmp-dialog.component'; +import {MainInfoComponent} from './editor/main-info/main-info.component'; +import {FundingInfoComponent} from './editor/funding-info/funding-info.component'; +import {DatasetInfoComponent} from './editor/dataset-info/dataset-info.component'; +import {DatasetEditorDetailsModule} from './editor/dataset-editor-details/dataset-editor-details.module'; +import {DatasetEditorDetailsComponent} from './editor/dataset-editor-details/dataset-editor-details.component'; +import {DatasetDescriptionFormModule} from '../misc/dataset-description-form/dataset-description-form.module'; +import {LicenseInfoComponent} from './editor/license-info/license-info.component'; +import {StartNewDatasetDialogComponent} from './start-new-dataset-dialogue/start-new-dataset-dialog.component'; +import {NgxDropzoneModule} from 'ngx-dropzone'; +import {DmpToDatasetDialogComponent} from './dmp-to-dataset/dmp-to-dataset-dialog.component'; +import { + FormProgressIndicationModule +} from '../misc/dataset-description-form/components/form-progress-indication/form-progress-indication.module'; +import {DatasetPreviewDialogComponent} from './dataset-preview/dataset-preview-dialog.component'; import {RichTextEditorModule} from "@app/library/rich-text-editor/rich-text-editor.module"; -import { DmpDepositDialogComponent } from './editor/dmp-deposit-dialog/dmp-deposit-dialog.component'; @NgModule({ imports: [ @@ -104,8 +110,7 @@ import { DmpDepositDialogComponent } from './editor/dmp-deposit-dialog/dmp-depos FundingInfoComponent, DatasetInfoComponent, LicenseInfoComponent, - DatasetPreviewDialogComponent, - DmpDepositDialogComponent + DatasetPreviewDialogComponent ], entryComponents: [ DmpInvitationDialogComponent, @@ -121,8 +126,7 @@ import { DmpDepositDialogComponent } from './editor/dmp-deposit-dialog/dmp-depos StartNewDmpDialogComponent, StartNewDatasetDialogComponent, DatasetEditorDetailsComponent, - DatasetPreviewDialogComponent, - DmpDepositDialogComponent + DatasetPreviewDialogComponent ] }) export class DmpModule { } diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.html b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.html deleted file mode 100644 index 1ab72528e..000000000 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.html +++ /dev/null @@ -1,21 +0,0 @@ -
-
{{ data.message }}
-
- close -
-
-
- - - -
-
{{'DMP-OVERVIEW.DEPOSIT.NO-REPOSITORIES' | translate}}
- -
-
- -
- -
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.scss b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.scss deleted file mode 100644 index e69de29bb..000000000 diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts deleted file mode 100644 index 5254b633b..000000000 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { DepositConfigurationStatus } from '@app/core/common/enum/deposit-configuration-status'; -import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration'; -import { DmpOverviewModel } from '@app/core/model/dmp/dmp-overview'; -import { DoiModel } from '@app/core/model/doi/doi'; -import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service'; -import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; -import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; -import { BaseComponent } from '@common/base/base.component'; -import { MultipleChoiceDialogComponent } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.component'; -import { TranslateService } from '@ngx-translate/core'; -import { takeUntil } from 'rxjs/operators'; - -@Component({ - selector: 'app-dmp-deposit-dialog', - templateUrl: './dmp-deposit-dialog.component.html', - styleUrls: ['./dmp-deposit-dialog.component.scss'] -}) -export class DmpDepositDialogComponent extends BaseComponent implements OnInit { - - inputRepos: DepositConfigurationModel[]; - outputRepos: DoiModel[]; - dmp: DmpOverviewModel; - private oauthLock: boolean; - - constructor( - private depositRepositoriesService: DepositRepositoriesService, - public dialogRef: MatDialogRef, - private dialog: MatDialog, - private language: TranslateService, - private translate: TranslateService, - private uiNotificationService: UiNotificationService, - private oauth2DialogService: Oauth2DialogService, - @Inject(MAT_DIALOG_DATA) public data: any - ) { - super(); - this.inputRepos = data['depositRepos'][0]; - this.dmp = data['depositRepos'][1]; - for(var i = 0; i < this.dmp.dois.length; i++){ - this.inputRepos = this.inputRepos.filter(r => this.hasDoi(r, this.dmp.dois, i)); - } - this.outputRepos = []; - } - - hasDoi(repo, dois, i){ - return repo.repositoryId !== dois[i].repositoryId; - } - - ngOnInit(): void { - } - - onSubmit() { - this.dialogRef.close(this.outputRepos); - } - - close() { - this.dialogRef.close(this.outputRepos); - } - - deposit(repo: DepositConfigurationModel) { - - if(repo.depositType == DepositConfigurationStatus.BothSystemAndUser){ - - const dialogRef = this.dialog.open(MultipleChoiceDialogComponent, { - maxWidth: '600px', - restoreFocus: false, - data: { - message: this.language.instant('DMP-OVERVIEW.DEPOSIT.ACCOUNT-LOGIN'), - titles: [this.language.instant('DMP-OVERVIEW.DEPOSIT.LOGIN', { 'repository': repo.repositoryId }), this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.USE-DEFAULT')] - } - }); - dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { - switch (result) { - case 0: - this.showOauth2Dialog(repo.repositoryAuthorizationUrl + '?client_id=' + repo.repositoryClientId - + '&response_type=code&scope=deposit:write+deposit:actions+user:email&state=astate&redirect_uri=' - + repo.redirectUri, repo, this.dmp); - break; - case 1: - this.depositRepositoriesService.createDoi(repo.repositoryId, this.dmp.id, null) - .pipe(takeUntil(this._destroyed)) - .subscribe(doi =>{ - this.onDOICallbackSuccess(); - this.outputRepos.push(doi); - this.close(); - }, error => this.onDOICallbackError(error)); - break; - } - }); - - } - else if(repo.depositType == DepositConfigurationStatus.System){ - this.depositRepositoriesService.createDoi(repo.repositoryId, this.dmp.id, null) - .pipe(takeUntil(this._destroyed)) - .subscribe(doi =>{ - this.onDOICallbackSuccess(); - this.outputRepos.push(doi); - this.close(); - }, error => this.onDOICallbackError(error)); - } - } - - 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); - } - - showOauth2Dialog(url: string, repo: DepositConfigurationModel, dmp: DmpOverviewModel) { - this.oauth2DialogService.login(url) - .pipe(takeUntil(this._destroyed)) - .subscribe(result => { - if (result !== undefined) { - if (result.oauthCode !== undefined && result.oauthCode !== null && !this.oauthLock) { - this.depositRepositoriesService.getAccessToken(repo.repositoryId, result.oauthCode) - .pipe(takeUntil(this._destroyed)) - .subscribe(token => { - this.depositRepositoriesService.createDoi(repo.repositoryId, dmp.id, token) - .pipe(takeUntil(this._destroyed)) - .subscribe(doi =>{ - this.onDOICallbackSuccess(); - this.outputRepos.push(doi); - this.close(); - }, error => this.onDOICallbackError(error)); - }); - this.oauthLock = true; - } - } - else{ - this.oauthLock = false; - } - }); - } - -} diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.html b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.html new file mode 100644 index 000000000..08206f330 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.html @@ -0,0 +1,13 @@ +
+ +

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

+
+ + + diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.scss b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.scss new file mode 100644 index 000000000..4d8681e21 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.scss @@ -0,0 +1,36 @@ +.frame-btn { + border: 1px solid #212121; + color: black; + background: #ffffff; + box-shadow: 0px 2px 6px #00000029; + display: flex; + justify-content: center; + align-items: center; +} + +.frame-txt { + color: #000000; + font-size: 0.75em; + font-weight: bold; + letter-spacing: 0px; + text-transform: uppercase; + cursor: pointer; +} + +.mat-mini-fab { + width: 2.5em; + height: 2.5em; +} + +.mat-mini-fab-icon { + font-size: 1.2em; + display: flex; + justify-content: center; + align-items: center; +} + +.logo { + margin-right: 16px; + max-width: 24px; + max-height: 24px; +} diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.ts new file mode 100644 index 000000000..aecfb4399 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component.ts @@ -0,0 +1,140 @@ +import {Component, EventEmitter, Inject, Input, OnInit, Output} from '@angular/core'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import {DepositConfigurationStatus} from '@app/core/common/enum/deposit-configuration-status'; +import {DepositConfigurationModel} from '@app/core/model/deposit/deposit-configuration'; +import {DmpOverviewModel} from '@app/core/model/dmp/dmp-overview'; +import {DoiModel} from '@app/core/model/doi/doi'; +import {DepositRepositoriesService} from '@app/core/services/deposit-repositories/deposit-repositories.service'; +import { + SnackBarNotificationLevel, + UiNotificationService +} from '@app/core/services/notification/ui-notification-service'; +import {Oauth2DialogService} from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; +import {BaseComponent} from '@common/base/base.component'; +import {MultipleChoiceDialogComponent} from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.component'; +import {TranslateService} from '@ngx-translate/core'; +import {takeUntil} from 'rxjs/operators'; +import {DomSanitizer, SafeHtml, SafeResourceUrl} from "@angular/platform-browser"; + +@Component({ + selector: 'app-dmp-deposit-dropdown', + templateUrl: './dmp-deposit-dropdown.component.html', + styleUrls: ['./dmp-deposit-dropdown.component.scss'] +}) +export class DmpDepositDropdown extends BaseComponent implements OnInit { + @Input() + inputRepos: DepositConfigurationModel[]; + @Input() + dmp: DmpOverviewModel; + outputRepos = []; + logos: Map = new Map(); + @Output() + outputReposEmitter: EventEmitter = new EventEmitter(); + private oauthLock: boolean; + + constructor( + private depositRepositoriesService: DepositRepositoriesService, + private dialog: MatDialog, + private language: TranslateService, + private translate: TranslateService, + private uiNotificationService: UiNotificationService, + private oauth2DialogService: Oauth2DialogService, + private sanitizer: DomSanitizer + ) { + super(); + } + + hasDoi(repo, dois, i) { + return repo.repositoryId !== dois[i].repositoryId; + } + + ngOnInit(): void { + for (var i = 0; i < this.dmp.dois.length; i++) { + this.inputRepos = this.inputRepos.filter(r => this.hasDoi(r, this.dmp.dois, i)); + } + this.inputRepos.forEach(repo => { + if(repo.hasLogo) { + this.depositRepositoriesService.getLogo(repo.repositoryId).subscribe(logo => { + console.log(this.sanitizer.bypassSecurityTrustResourceUrl('data:image/png;base64,' + logo)); + this.logos.set(repo.repositoryId, this.sanitizer.bypassSecurityTrustResourceUrl('data:image/png;base64, ' + logo)); + }) + } + }) + } + + deposit(repo: DepositConfigurationModel) { + + if (repo.depositType == DepositConfigurationStatus.BothSystemAndUser) { + + const dialogRef = this.dialog.open(MultipleChoiceDialogComponent, { + maxWidth: '600px', + restoreFocus: false, + data: { + message: this.language.instant('DMP-OVERVIEW.DEPOSIT.ACCOUNT-LOGIN'), + titles: [this.language.instant('DMP-OVERVIEW.DEPOSIT.LOGIN', {'repository': repo.repositoryId}), this.language.instant('DMP-OVERVIEW.MULTIPLE-DIALOG.USE-DEFAULT')] + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + switch (result) { + case 0: + this.showOauth2Dialog(repo.repositoryAuthorizationUrl + '?client_id=' + repo.repositoryClientId + + '&response_type=code&scope=deposit:write+deposit:actions+user:email&state=astate&redirect_uri=' + + repo.redirectUri, repo, this.dmp); + break; + case 1: + this.depositRepositoriesService.createDoi(repo.repositoryId, this.dmp.id, null) + .pipe(takeUntil(this._destroyed)) + .subscribe(doi => { + this.onDOICallbackSuccess(); + this.outputRepos.push(doi); + this.outputReposEmitter.emit(this.outputRepos); + }, error => this.onDOICallbackError(error)); + break; + } + }); + + } else if (repo.depositType == DepositConfigurationStatus.System) { + this.depositRepositoriesService.createDoi(repo.repositoryId, this.dmp.id, null) + .pipe(takeUntil(this._destroyed)) + .subscribe(doi => { + this.onDOICallbackSuccess(); + this.outputRepos.push(doi); + this.outputReposEmitter.emit(this.outputRepos); + }, error => this.onDOICallbackError(error)); + } + } + + 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); + } + + showOauth2Dialog(url: string, repo: DepositConfigurationModel, dmp: DmpOverviewModel) { + this.oauth2DialogService.login(url) + .pipe(takeUntil(this._destroyed)) + .subscribe(result => { + if (result !== undefined) { + if (result.oauthCode !== undefined && result.oauthCode !== null && !this.oauthLock) { + this.depositRepositoriesService.getAccessToken(repo.repositoryId, result.oauthCode) + .pipe(takeUntil(this._destroyed)) + .subscribe(token => { + this.depositRepositoriesService.createDoi(repo.repositoryId, dmp.id, token) + .pipe(takeUntil(this._destroyed)) + .subscribe(doi => { + this.onDOICallbackSuccess(); + this.outputRepos.push(doi); + this.outputReposEmitter.emit(this.outputRepos); + }, error => this.onDOICallbackError(error)); + }); + this.oauthLock = true; + } + } else { + this.oauthLock = false; + } + }); + } + +} diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index ef03de5fe..3fd9c3472 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -112,13 +112,19 @@
-

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

-
- - - {{doi.repositoryId}} - - +
+ {{'DMP-EDITOR.TITLE.SUBTITLE' | translate}}: + + + + {{doi.repositoryId}} + + + +
+ +
+ {{selectedModel.doi}}
-
- -

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

-
-
+ +
diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss index 200ae686d..19f35902f 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss @@ -195,8 +195,7 @@ .doi-label { font-size: 1em; - color: #212121; - opacity: 0.6; + color: rgba(33, 33, 33, 0.6); margin-bottom: 0.3em; } @@ -337,6 +336,10 @@ padding: 0rem 0rem 0.4rem 0rem !important; } +.select-repo { + border-bottom: 1px solid #212121; +} + // .card-content { // display: flex; // justify-content: center; diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 6848e176e..0778658bf 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -1,51 +1,52 @@ - -import { Component, OnInit, 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'; -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'; -import { TranslateService } from '@ngx-translate/core'; +import {Component, ElementRef, OnInit, ViewChild} 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'; +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'; +import {TranslateService} from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; -import { Observable, of as observableOf } from 'rxjs'; -import { takeUntil, map } from 'rxjs/operators'; -import { Role } from "@app/core/common/enum/role"; -import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation-dialog.component'; -import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; -import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; -import { UserService } from '@app/core/services/user/user.service'; -import { Location } from '@angular/common'; -import { FormGroup } from '@angular/forms'; -import { LockService } from '@app/core/services/lock/lock.service'; -import { VersionListingModel } from '@app/core/model/version/version-listing.model'; -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'; -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'; -import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component'; -import { DepositRepositoriesService } from '@app/core/services/deposit-repositories/deposit-repositories.service'; -import { DmpDepositDialogComponent } from '../editor/dmp-deposit-dialog/dmp-deposit-dialog.component'; -import { DepositConfigurationModel } from '@app/core/model/deposit/deposit-configuration'; -import { DoiModel } from '@app/core/model/doi/doi'; -import { MatSelect } from '@angular/material/select'; -import { isNullOrUndefined } from '@app/utilities/enhancers/utils'; +import {Observable, of as observableOf} from 'rxjs'; +import {map, takeUntil} from 'rxjs/operators'; +import {Role} from "@app/core/common/enum/role"; +import {DmpInvitationDialogComponent} from '../invitation/dmp-invitation-dialog.component'; +import {ConfigurationService} from '@app/core/services/configuration/configuration.service'; +import {Location} from '@angular/common'; +import {FormGroup} from '@angular/forms'; +import {LockService} from '@app/core/services/lock/lock.service'; +import {VersionListingModel} from '@app/core/model/version/version-listing.model'; +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'; +import {StartNewDmpDialogComponent} from '../start-new-dmp-dialogue/start-new-dmp-dialog.component'; +import {MatomoService} from '@app/core/services/matomo/matomo-service'; +import {PopupNotificationDialogComponent} from '@app/library/notification/popup/popup-notification.component'; +import {DepositRepositoriesService} from '@app/core/services/deposit-repositories/deposit-repositories.service'; +import {DepositConfigurationModel} from '@app/core/model/deposit/deposit-configuration'; +import {DoiModel} from '@app/core/model/doi/doi'; +import {isNullOrUndefined} from '@app/utilities/enhancers/utils'; @Component({ selector: 'app-dmp-overview', @@ -68,6 +69,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { textMessage: any; versions: VersionListingModel[]; version: VersionListingModel; + selectedModel: DoiModel; @ViewChild('doi') doi: ElementRef; @@ -109,6 +111,9 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; + if(!this.hasDoi()) { + this.selectedModel = this.dmp.dois[0]; + } this.checkLockStatus(this.dmp.id); this.setIsUserOwner(); this.getAllVersions(this.dmp); @@ -133,6 +138,9 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; + if(!this.hasDoi()) { + this.selectedModel = this.dmp.dois[0]; + } // this.checkLockStatus(this.dmp.id); this.getAllVersions(this.dmp); const breadCrumbs = []; @@ -454,8 +462,8 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { return (dmp.status == DmpStatus.Finalized && dmp.isPublic); } - hasDoi(dmp: DmpOverviewModel) { - return (this.dmp.dois == null || this.dmp.dois.length == 0) ? true : false; + hasDoi(dmp: DmpOverviewModel = null) { + return (this.dmp.dois == null || this.dmp.dois.length == 0); } getAllVersions(dmp: DmpOverviewModel) { @@ -494,29 +502,15 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { }); } - deposit(){ - const dialogRef = this.dialog.open(DmpDepositDialogComponent, { - maxWidth: '600px', - disableClose: true, - restoreFocus: false, - autoFocus: false, - data: { - depositRepos: [this.depositRepos, this.dmp], - message: this.language.instant('DMP-OVERVIEW.DEPOSIT.SELECT-REPOSITORIES'), - confirmButton: this.language.instant('DMP-OVERVIEW.DEPOSIT.AUTHORIZE'), - cancelButton: this.language.instant('DMP-OVERVIEW.DEPOSIT.CANCEL'), - } - }); - dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe((result: DoiModel[]) => { - if (result.length > 0) { - this.dmp.dois.push(...result); - this.hasDOIToken = true; - } - }); + afterDeposit(result: DoiModel[]) { + if (result.length > 0) { + this.dmp.dois.push(...result); + this.hasDOIToken = true; + } } moreDeposit(){ - return (this.dmp.dois.length < this.depositRepos.length) ? true : false; + return (this.dmp.dois.length < this.depositRepos.length); } finalize(dmp: DmpOverviewModel) { @@ -537,7 +531,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { }), accessRights: extraProperties.visible } - + const dialogRef = this.dialog.open(DmpFinalizeDialogComponent, { maxWidth: '500px', restoreFocus: false, @@ -642,8 +636,8 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.router.navigate(['/datasets', 'new', this.dmp.id]); } - selectDoi(s: MatSelect, doiModel: DoiModel){ - s.placeholder = doiModel.doi; + selectDoi(doiModel: DoiModel){ + this.selectedModel = doiModel; const foundIdx = this.dmp.dois.findIndex(el => el == doiModel); this.dmp.dois.splice(foundIdx, 1); this.dmp.dois.unshift(doiModel); diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.module.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.module.ts index dc73b4f76..53561af58 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.module.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.module.ts @@ -10,21 +10,24 @@ import { CommonUiModule } from '@common/ui/common-ui.module'; import { RouterModule } from '@angular/router'; import { CloneDialogModule } from '../clone/clone-dialog/clone-dialog.module'; import { NgDialogAnimationService } from 'ng-dialog-animation'; +import {DmpModule} from "@app/ui/dmp/dmp.module"; +import {DmpDepositDropdown} from "@app/ui/dmp/editor/dmp-deposit-dropdown/dmp-deposit-dropdown.component"; @NgModule({ - imports: [ - CommonUiModule, - CommonFormsModule, - UrlListingModule, - ConfirmationDialogModule, - CloneDialogModule, - ExportMethodDialogModule, - FormattingModule, - AutoCompleteModule, - RouterModule - ], + imports: [ + CommonUiModule, + CommonFormsModule, + UrlListingModule, + ConfirmationDialogModule, + CloneDialogModule, + ExportMethodDialogModule, + FormattingModule, + AutoCompleteModule, + RouterModule + ], declarations: [ - DmpOverviewComponent + DmpOverviewComponent, + DmpDepositDropdown ], providers: [ NgDialogAnimationService diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 0e7336915..da9ec99c6 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1017,7 +1017,7 @@ "CLONE-DMP": "Clone", "NEW-VERSION": "New Version", "CREATE-DATASET": "Creating Dataset", - "SUBTITLE": "DOI", + "SUBTITLE": "DOI provided by", "PREVIEW-DATASET": "Previewing Dataset" }, "FIELDS": { diff --git a/dmp-frontend/src/assets/images/repository-placeholder.png b/dmp-frontend/src/assets/images/repository-placeholder.png new file mode 100644 index 000000000..c5f84947a Binary files /dev/null and b/dmp-frontend/src/assets/images/repository-placeholder.png differ