fix editing dmp page, add section templates to new dataset page
This commit is contained in:
parent
6154a5fa51
commit
29f5b6a6cc
|
@ -9,6 +9,7 @@ import { JsonParserPipe } from './pipes/json-parser.pipe';
|
||||||
import { DateTimeCultureFormatPipe } from './pipes/date-time-culture-format.pipe';
|
import { DateTimeCultureFormatPipe } from './pipes/date-time-culture-format.pipe';
|
||||||
import {FieldValuePipe} from "@app/core/pipes/field-value.pipe";
|
import {FieldValuePipe} from "@app/core/pipes/field-value.pipe";
|
||||||
import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe";
|
import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe";
|
||||||
|
import { DatasetInSectioPipe } from './pipes/dataset-in-section.pipe';
|
||||||
|
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
@ -25,7 +26,8 @@ import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe";
|
||||||
DateTimeCultureFormatPipe,
|
DateTimeCultureFormatPipe,
|
||||||
JsonParserPipe,
|
JsonParserPipe,
|
||||||
FieldValuePipe,
|
FieldValuePipe,
|
||||||
ColumnClassPipe
|
ColumnClassPipe,
|
||||||
|
DatasetInSectioPipe
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
NgForLimitPipe,
|
NgForLimitPipe,
|
||||||
|
@ -35,7 +37,8 @@ import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe";
|
||||||
DateTimeCultureFormatPipe,
|
DateTimeCultureFormatPipe,
|
||||||
JsonParserPipe,
|
JsonParserPipe,
|
||||||
FieldValuePipe,
|
FieldValuePipe,
|
||||||
ColumnClassPipe
|
ColumnClassPipe,
|
||||||
|
DatasetInSectioPipe
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
EnumUtils,
|
EnumUtils,
|
||||||
|
@ -47,7 +50,8 @@ import {ColumnClassPipe} from "@app/core/pipes/column-class.pipe";
|
||||||
DateTimeCultureFormatPipe,
|
DateTimeCultureFormatPipe,
|
||||||
JsonParserPipe,
|
JsonParserPipe,
|
||||||
FieldValuePipe,
|
FieldValuePipe,
|
||||||
ColumnClassPipe
|
ColumnClassPipe,
|
||||||
|
DatasetInSectioPipe
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class FormattingModule { }
|
export class FormattingModule { }
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { DmpDatasetProfileSectionsFormModel } from "./dmp-dataset-profile-sectio
|
||||||
|
|
||||||
export interface DmpDatasetProfile {
|
export interface DmpDatasetProfile {
|
||||||
id: string;
|
id: string;
|
||||||
|
descriptionTemplateId: string;
|
||||||
label: string;
|
label: string;
|
||||||
data: DmpDatasetProfileSectionsFormModel;
|
data: DmpDatasetProfileSectionsFormModel;
|
||||||
}
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
import { Pipe, PipeTransform } from "@angular/core";
|
||||||
|
import { FormGroup } from "@angular/forms";
|
||||||
|
|
||||||
|
@Pipe({
|
||||||
|
name: 'datasetInSection'
|
||||||
|
})
|
||||||
|
export class DatasetInSectioPipe implements PipeTransform{
|
||||||
|
|
||||||
|
transform(datasets: FormGroup[], args: string): FormGroup[] {
|
||||||
|
let values = [];
|
||||||
|
for(var dataset of datasets){
|
||||||
|
if(dataset.get('dmpSectionIndex').value == args){
|
||||||
|
values.push(dataset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
}
|
|
@ -172,7 +172,7 @@
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label>Placeholder</mat-label>
|
<mat-label>Placeholder</mat-label>
|
||||||
<input matInput type="text" name="placeholder" formControlName="placolder">
|
<input matInput type="text" name="placeholder" formControlName="placeholder">
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-2">
|
<div class="col-2">
|
||||||
|
|
|
@ -141,7 +141,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto form" id="dataset-editor-form">
|
<div class="col-auto form" id="dataset-editor-form">
|
||||||
<app-dataset-editor-component [hidden]="this.step !== 0" [formGroup]="formGroup" [dmpId]="formGroup.get('dmp').value.id" [availableProfiles]="formGroup.get('dmp').value.profiles" (formChanged)="formChanged()"></app-dataset-editor-component>
|
<app-dataset-editor-component [hidden]="this.step !== 0" [formGroup]="formGroup" [dmpId]="formGroup.get('dmp').value.id" [availableProfiles]="availableDescriptionTemplates" (formChanged)="formChanged()"></app-dataset-editor-component>
|
||||||
<app-dataset-description (visibilityRulesInstance)="visRulesService = $event" [TOCENTRY_ID_PREFIX]="TOCENTRY_ID_PREFIX" [hidden]="this.step === 0" *ngIf="formGroup && formGroup.get('datasetProfileDefinition')" [form]="this.formGroup.get('datasetProfileDefinition')" [visibilityRules]="formGroup.get('datasetProfileDefinition').get('rules').value" [datasetProfileId]="formGroup.get('profile').value" [linkToScroll]="linkToScroll" (fieldsetFocusChange)="fieldsetIdWithFocus = $event"></app-dataset-description>
|
<app-dataset-description (visibilityRulesInstance)="visRulesService = $event" [TOCENTRY_ID_PREFIX]="TOCENTRY_ID_PREFIX" [hidden]="this.step === 0" *ngIf="formGroup && formGroup.get('datasetProfileDefinition')" [form]="this.formGroup.get('datasetProfileDefinition')" [visibilityRules]="formGroup.get('datasetProfileDefinition').get('rules').value" [datasetProfileId]="formGroup.get('profile').value" [linkToScroll]="linkToScroll" (fieldsetFocusChange)="fieldsetIdWithFocus = $event"></app-dataset-description>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -62,6 +62,7 @@ import {CheckDeactivateBaseComponent} from '@app/library/deactivate/deactivate.c
|
||||||
import {PrefillDatasetComponent} from "@app/ui/dataset/dataset-wizard/prefill-dataset/prefill-dataset.component";
|
import {PrefillDatasetComponent} from "@app/ui/dataset/dataset-wizard/prefill-dataset/prefill-dataset.component";
|
||||||
import {ToCEntry, ToCEntryType} from "@app/ui/misc/dataset-description-form/dataset-description.component";
|
import {ToCEntry, ToCEntryType} from "@app/ui/misc/dataset-description-form/dataset-description.component";
|
||||||
import {dispatchFakeEvent} from "@angular/cdk/testing/testbed/fake-events";
|
import {dispatchFakeEvent} from "@angular/cdk/testing/testbed/fake-events";
|
||||||
|
import { DmpDatasetProfile } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-dataset-wizard-component',
|
selector: 'app-dataset-wizard-component',
|
||||||
|
@ -96,6 +97,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
||||||
itemId: string;
|
itemId: string;
|
||||||
dmpId: string;
|
dmpId: string;
|
||||||
dmpSectionIndex: number;
|
dmpSectionIndex: number;
|
||||||
|
availableDescriptionTemplates: DatasetProfileModel[] = [];
|
||||||
newDmpId: string;
|
newDmpId: string;
|
||||||
publicId: string;
|
publicId: string;
|
||||||
profileUpdateId: string;
|
profileUpdateId: string;
|
||||||
|
@ -172,7 +174,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
||||||
const data: any = this.route.snapshot.data;
|
const data: any = this.route.snapshot.data;
|
||||||
this.itemId = params['id'];
|
this.itemId = params['id'];
|
||||||
this.dmpId = params['dmpId'];
|
this.dmpId = params['dmpId'];
|
||||||
this.dmpSectionIndex = params['dmpSectionIndex'];
|
this.dmpSectionIndex = parseInt(params['dmpSectionIndex']);
|
||||||
this.newDmpId = queryParams['newDmpId'];
|
this.newDmpId = queryParams['newDmpId'];
|
||||||
this.publicId = params['publicId'];
|
this.publicId = params['publicId'];
|
||||||
this.profileUpdateId = params['updateId'];
|
this.profileUpdateId = params['updateId'];
|
||||||
|
@ -270,6 +272,10 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
||||||
this.datasetWizardModel.dmp = data;
|
this.datasetWizardModel.dmp = data;
|
||||||
this.datasetWizardModel.dmpSectionIndex = this.dmpSectionIndex;
|
this.datasetWizardModel.dmpSectionIndex = this.dmpSectionIndex;
|
||||||
this.formGroup = this.datasetWizardModel.buildForm();
|
this.formGroup = this.datasetWizardModel.buildForm();
|
||||||
|
let profiles = this.datasetWizardModel.dmp.profiles.filter(profile => profile.data.dmpSectionIndex.includes(this.dmpSectionIndex));
|
||||||
|
for(var profile of profiles){
|
||||||
|
this.availableDescriptionTemplates.push({id: profile.descriptionTemplateId, label: profile.label, description: ""})
|
||||||
|
}
|
||||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||||
this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft;
|
this.editMode = this.datasetWizardModel.status === DatasetStatus.Draft;
|
||||||
this.formGroup.get('dmp').disable();
|
this.formGroup.get('dmp').disable();
|
||||||
|
@ -278,7 +284,7 @@ export class DatasetWizardComponent extends CheckDeactivateBaseComponent impleme
|
||||||
minHeight: '200px',
|
minHeight: '200px',
|
||||||
restoreFocus: false,
|
restoreFocus: false,
|
||||||
data: {
|
data: {
|
||||||
availableProfiles: this.formGroup.get('dmp').value.profiles,
|
availableProfiles: this.availableDescriptionTemplates,
|
||||||
},
|
},
|
||||||
panelClass: 'custom-modalbox'
|
panelClass: 'custom-modalbox'
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="form-container">
|
<div *ngIf="formGroup" [formGroup]="formGroup" class="form-container">
|
||||||
<!-- DMP Header -->
|
<!-- DMP Header -->
|
||||||
<div [hidden]="false" class="fixed-editor-header">
|
<div [hidden]="false" class="fixed-editor-header">
|
||||||
<div class="card editor-header">
|
<div class="card editor-header">
|
||||||
|
@ -8,25 +8,25 @@
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-auto info">
|
<div class="col-auto info">
|
||||||
<div class="title">{{'DMP-EDITOR.TITLE.EDIT-DMP' | translate}}</div>
|
<div class="title">{{'DMP-EDITOR.TITLE.EDIT-DMP' | translate}}</div>
|
||||||
<!-- <div class="subtitle">{{ formGroup.get('label').value }} <span *ngIf="isDirty()" class="changes">({{'DMP-EDITOR.CHANGES' | translate}})</span></div> -->
|
<div class="subtitle">{{ formGroup.get('label').value }} <span *ngIf="isDirty()" class="changes">({{'DMP-EDITOR.CHANGES' | translate}})</span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ml-auto d-flex flex-row">
|
<div class="ml-auto d-flex flex-row">
|
||||||
<!-- <mat-divider *ngIf="formGroup.get('id').value && (isDirty() || isNew || (!isNew && formGroup.enabled && !lockStatus) || lockStatus)"
|
<!-- <mat-divider *ngIf="formGroup.get('id').value && (isDirty() || isNew || (!isNew && formGroup.enabled && !lockStatus) || lockStatus)"
|
||||||
[vertical]="true" class="ml-2 mr-2">
|
[vertical]="true" class="ml-2 mr-2">
|
||||||
</mat-divider> -->
|
</mat-divider> -->
|
||||||
<div class="col-auto d-flex align-items-center">
|
<div class="col-auto d-flex align-items-center">
|
||||||
<!-- <button [disabled]="saving" *ngIf="isDirty()" type="button" mat-raised-button class="discard-btn mr-3" (click)="discard()">
|
<button [disabled]="saving" *ngIf="isDirty()" type="button" mat-raised-button class="discard-btn mr-3" (click)="discard()">
|
||||||
{{'DMP-EDITOR.ACTIONS.DISCARD' | translate}}
|
{{'DMP-EDITOR.ACTIONS.DISCARD' | translate}}
|
||||||
</button> -->
|
</button>
|
||||||
<button [disabled]="saving" *ngIf="isNew" mat-raised-button type="button" (click)="save()" class="save-btn">
|
<button [disabled]="saving" *ngIf="isNew" mat-raised-button type="button" (click)="save()" class="save-btn">
|
||||||
{{'DMP-EDITOR.ACTIONS.SAVE' | translate}}
|
{{'DMP-EDITOR.ACTIONS.SAVE' | translate}}
|
||||||
</button>
|
</button>
|
||||||
<!-- <div *ngIf="!isNew && formGroup.enabled && !lockStatus">
|
<div *ngIf="!isNew && formGroup.enabled && !lockStatus">
|
||||||
<button [disabled]="saving" *ngIf="!isFinalized" mat-raised-button (click)="formSubmit()" class="save-btn">
|
<button [disabled]="saving" *ngIf="!isFinalized" mat-raised-button (click)="formSubmit()" class="save-btn">
|
||||||
{{'DMP-EDITOR.ACTIONS.SAVE' | translate}}
|
{{'DMP-EDITOR.ACTIONS.SAVE' | translate}}
|
||||||
</button>
|
</button>
|
||||||
</div> -->
|
</div>
|
||||||
<!-- <button *ngIf="lockStatus" mat-raised-button disabled class="dataset-save-btn cursor-default" type="button">{{ 'DMP-OVERVIEW.LOCKED' | translate}}</button> -->
|
<button *ngIf="lockStatus" mat-raised-button disabled class="dataset-save-btn cursor-default" type="button">{{ 'DMP-OVERVIEW.LOCKED' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -42,9 +42,18 @@
|
||||||
<div *ngIf="selectedDmpBlueprintDefinition && this.step !== 0">
|
<div *ngIf="selectedDmpBlueprintDefinition && this.step !== 0">
|
||||||
<div *ngFor="let section of selectedDmpBlueprintDefinition.sections; let i=index">
|
<div *ngFor="let section of selectedDmpBlueprintDefinition.sections; let i=index">
|
||||||
<li (click)="changeStep(i + 1)" [ngClass]="{'active': this.step === (i + 1)}">{{section.label}}</li>
|
<li (click)="changeStep(i + 1)" [ngClass]="{'active': this.step === (i + 1)}">{{section.label}}</li>
|
||||||
|
<ol class="datasetsInSection">
|
||||||
|
<li *ngFor="let dataset of datasets.controls | datasetInSection: i; let datasetIndex = index" (click)="editDataset(dataset.get('id').value, false)" class="active-dataset">
|
||||||
|
<div class="d-flex flex-direction-row">
|
||||||
|
<div class="label" matTooltip="{{dataset.get('label').value}}">{{'DMP-EDITOR.STEPPER.DATASET' | translate}}: {{ dataset.get('label').value }}</div>
|
||||||
|
<mat-icon *ngIf="dataset.get('status').value !== 1" class="ml-2 mr-2 remove-dataset size-16" matTooltip="{{'DMP-EDITOR.ACTIONS.DELETE' | translate}}" (click)="$event.stopPropagation(); removeDataset(dataset.get('id').value, datasetIndex)">close</mat-icon>
|
||||||
|
<mat-icon *ngIf="dataset.get('status').value === 1" class="ml-2 mr-2 status-icon check-icon size-16" matTooltip="{{'TYPES.DATASET-STATUS.FINALISED' | translate}}">check</mat-icon>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
<ul *ngIf="hasProfile()" class="add-dataset-option">
|
<ul *ngIf="hasProfile()" class="add-dataset-option">
|
||||||
<li>
|
<li>
|
||||||
<a class="add-dataset-action" [routerLink]="['/datasets/new/' + dmp.id]">
|
<a class="add-dataset-action" (click)="addDataset(i)">
|
||||||
<mat-icon>add</mat-icon>{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}}
|
<mat-icon>add</mat-icon>{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -72,7 +81,7 @@
|
||||||
<app-form-progress-indication class="col-12" *ngIf="formGroup && !formGroup.disabled && !lockStatus" [formGroup]="formGroup" [isDmpEditor]="true"></app-form-progress-indication>
|
<app-form-progress-indication class="col-12" *ngIf="formGroup && !formGroup.disabled && !lockStatus" [formGroup]="formGroup" [isDmpEditor]="true"></app-form-progress-indication>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto formForStep0" id="editor-form" *ngIf="this.step ===0">
|
<div class="col-auto formForStep0" id="editor-form" *ngIf="this.step === 0 && this.isNew">
|
||||||
<div class="col-12 blueprint-section" [hidden]="this.step !== 0">
|
<div class="col-12 blueprint-section" [hidden]="this.step !== 0">
|
||||||
<div class="input-form">
|
<div class="input-form">
|
||||||
<div class="heading2">0.1 Title of DMP *</div>
|
<div class="heading2">0.1 Title of DMP *</div>
|
||||||
|
@ -116,7 +125,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto form" id="editor-form" *ngIf="this.step !==0">
|
<div class="col-auto form" id="editor-form" *ngIf="this.step !== 0">
|
||||||
<div *ngIf="selectedDmpBlueprintDefinition">
|
<div *ngIf="selectedDmpBlueprintDefinition">
|
||||||
<div *ngFor="let section of selectedDmpBlueprintDefinition.sections; let i=index">
|
<div *ngFor="let section of selectedDmpBlueprintDefinition.sections; let i=index">
|
||||||
<div class="section-info" [hidden]="this.step !== (i + 1)">
|
<div class="section-info" [hidden]="this.step !== (i + 1)">
|
||||||
|
@ -209,13 +218,13 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="field.type == 6">
|
<div *ngIf="field.type == 6">
|
||||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="false" [isNew]="true" [isUserOwner]="true" [type]="1" (onFormChanged)="formChanged()"></funding-info>
|
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [type]="1" (onFormChanged)="formChanged()"></funding-info>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="field.type == 7">
|
<div *ngIf="field.type == 7">
|
||||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="false" [isNew]="true" [isUserOwner]="true" [type]="2" (onFormChanged)="formChanged()"></funding-info>
|
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [type]="2" (onFormChanged)="formChanged()"></funding-info>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="field.type == 8">
|
<div *ngIf="field.type == 8">
|
||||||
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="false" [isNew]="true" [isUserOwner]="true" [type]="3" (onFormChanged)="formChanged()"></funding-info>
|
<funding-info [formGroup]="formGroup" [grantformGroup]="formGroup.get('grant')" [projectFormGroup]="formGroup.get('project')" [funderFormGroup]="formGroup.get('funder')" [isFinalized]="isFinalized" [isNew]="isNew" [isUserOwner]="isUserOwner" [type]="3" (onFormChanged)="formChanged()"></funding-info>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="field.type == 9">
|
<div *ngIf="field.type == 9">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
|
@ -294,7 +303,7 @@
|
||||||
<div class="heading">Description templates</div>
|
<div class="heading">Description templates</div>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label>{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}</mat-label>
|
<mat-label>{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}</mat-label>
|
||||||
<app-multiple-auto-complete placeholder="{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}" [hidePlaceholder]="true" required='true' [value]="sectionTemplates[section.ordinal - 1]" [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event)" (optionActionClicked)="onPreviewTemplate($event)" (optionSelected)="onOptionSelected()">
|
<app-multiple-auto-complete placeholder="{{'DMP-EDITOR.FIELDS.SELECT-TEMPLATE' | translate}}" [hidePlaceholder]="true" required='true' [value]="sectionTemplates[section.ordinal - 1]" [configuration]="profilesAutoCompleteConfiguration" (optionRemoved)="onRemoveTemplate($event)" (optionActionClicked)="onPreviewTemplate($event)" (optionSelected)="onOptionSelected($event, i)">
|
||||||
</app-multiple-auto-complete>
|
</app-multiple-auto-complete>
|
||||||
<mat-error *ngIf="formGroup.get('profiles').hasError('backendError')">
|
<mat-error *ngIf="formGroup.get('profiles').hasError('backendError')">
|
||||||
{{formGroup.get('profiles').getError('backendError').message}}</mat-error>
|
{{formGroup.get('profiles').getError('backendError').message}}</mat-error>
|
||||||
|
|
|
@ -38,6 +38,10 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.datasetsInSection {
|
||||||
|
counter-reset: item
|
||||||
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
|
@ -280,6 +284,24 @@ mat-icon.size-16 {
|
||||||
margin: 3rem 0rem 3rem 0rem;
|
margin: 3rem 0rem 3rem 0rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.changes {
|
||||||
|
font-weight: 400;
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.discard-btn {
|
||||||
|
background: transparent;
|
||||||
|
border: 1px solid #ffffff;
|
||||||
|
color: white;
|
||||||
|
border-radius: 30px;
|
||||||
|
opacity: 1;
|
||||||
|
width: 110px;
|
||||||
|
height: 40px;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: #000000;
|
color: #000000;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ import { FunderFormModel } from '../editor/grant-tab/funder-form-model';
|
||||||
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
|
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
|
||||||
import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
|
import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
|
||||||
import { AuthService } from '@app/core/services/auth/auth.service';
|
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
|
import { ConfigurationService } from '@app/core/services/configuration/configuration.service';
|
||||||
import { isNullOrUndefined } from '@app/utilities/enhancers/utils';
|
import { isNullOrUndefined } from '@app/utilities/enhancers/utils';
|
||||||
import { LanguageInfoService } from '@app/core/services/culture/language-info-service';
|
import { LanguageInfoService } from '@app/core/services/culture/language-info-service';
|
||||||
|
@ -22,7 +21,7 @@ import { UserModel } from '@app/core/model/user/user';
|
||||||
import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration';
|
import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { ExternalSourcesService } from '@app/core/services/external-sources/external-sources.service';
|
import { ExternalSourcesService } from '@app/core/services/external-sources/external-sources.service';
|
||||||
import { Observable } from 'rxjs';
|
import { Observable, interval } from 'rxjs';
|
||||||
import { ExternalSourceItemModel } from '@app/core/model/external-sources/external-source-item';
|
import { ExternalSourceItemModel } from '@app/core/model/external-sources/external-source-item';
|
||||||
import { OrganisationService } from '@app/core/services/organisation/organisation.service';
|
import { OrganisationService } from '@app/core/services/organisation/organisation.service';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
|
@ -40,13 +39,22 @@ import { FormValidationErrorsDialogComponent } from '@common/forms/form-validati
|
||||||
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
||||||
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
|
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
|
||||||
import { DmpModel } from '@app/core/model/dmp/dmp';
|
import { DmpModel } from '@app/core/model/dmp/dmp';
|
||||||
import { Router } from '@angular/router';
|
import { ActivatedRoute, Params, Router } from '@angular/router';
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||||
import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component';
|
import { DmpToDatasetDialogComponent } from '../dmp-to-dataset/dmp-to-dataset-dialog.component';
|
||||||
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
|
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
|
||||||
import { FormService } from '@common/forms/form-service';
|
import { FormService } from '@common/forms/form-service';
|
||||||
import { DmpDatasetProfile } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile';
|
import { DmpDatasetProfile } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile';
|
||||||
import { DmpDatasetProfileSectionsFormModel } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile-sections-form.model';
|
import { DmpDatasetProfileSectionsFormModel } from '@app/core/model/dmp/dmp-dataset-profile/dmp-dataset-profile-sections-form.model';
|
||||||
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
|
import { LockService } from '@app/core/services/lock/lock.service';
|
||||||
|
import { Principal } from '@app/core/model/auth/principal';
|
||||||
|
import { Role } from '@app/core/common/enum/role';
|
||||||
|
import { LockModel } from '@app/core/model/lock/lock.model';
|
||||||
|
import { Guid } from '@common/types/guid';
|
||||||
|
import { PopupNotificationDialogComponent } from '@app/library/notification/popup/popup-notification.component';
|
||||||
|
import { GrantEditorModel } from '@app/ui/grant/editor/grant-editor.model';
|
||||||
|
import { CheckDeactivateBaseComponent } from '@app/library/deactivate/deactivate.component';
|
||||||
|
|
||||||
interface Visible {
|
interface Visible {
|
||||||
value: boolean;
|
value: boolean;
|
||||||
|
@ -58,7 +66,11 @@ interface Visible {
|
||||||
templateUrl: './dmp-editor-blueprint.component.html',
|
templateUrl: './dmp-editor-blueprint.component.html',
|
||||||
styleUrls: ['./dmp-editor-blueprint.component.scss']
|
styleUrls: ['./dmp-editor-blueprint.component.scss']
|
||||||
})
|
})
|
||||||
export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit {
|
export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent implements OnInit {
|
||||||
|
|
||||||
|
canDeactivate(): boolean {
|
||||||
|
return !this.isDirty();
|
||||||
|
}
|
||||||
|
|
||||||
saving = false;
|
saving = false;
|
||||||
|
|
||||||
|
@ -78,10 +90,12 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
dmpSectionIndex: number = 0;
|
dmpSectionIndex: number = 0;
|
||||||
formGroup: FormGroup = null;
|
formGroup: FormGroup = null;
|
||||||
formGroupRawValue: any;
|
formGroupRawValue: any;
|
||||||
|
datasets = new FormArray([]);
|
||||||
|
|
||||||
associatedUsers: Array<UserModel>;
|
associatedUsers: Array<UserModel>;
|
||||||
people: Array<UserInfoListingModel>;
|
people: Array<UserInfoListingModel>;
|
||||||
|
|
||||||
|
lock: LockModel;
|
||||||
lockStatus: Boolean = false;
|
lockStatus: Boolean = false;
|
||||||
|
|
||||||
step: number = 0;
|
step: number = 0;
|
||||||
|
@ -114,6 +128,7 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
constructor(
|
constructor(
|
||||||
private dmpProfileService: DmpProfileService,
|
private dmpProfileService: DmpProfileService,
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
|
private route: ActivatedRoute,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private configurationService: ConfigurationService,
|
private configurationService: ConfigurationService,
|
||||||
private languageInfoService: LanguageInfoService,
|
private languageInfoService: LanguageInfoService,
|
||||||
|
@ -123,54 +138,150 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
private dmpService: DmpService,
|
private dmpService: DmpService,
|
||||||
private uiNotificationService: UiNotificationService,
|
private uiNotificationService: UiNotificationService,
|
||||||
private formService: FormService,
|
private formService: FormService,
|
||||||
private dialog: MatDialog
|
private dialog: MatDialog,
|
||||||
|
private lockService: LockService,
|
||||||
|
private matomoService: MatomoService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.dmp = new DmpEditorModel();
|
this.matomoService.trackPageView('DMP Editor');
|
||||||
this.dmp.grant = new GrantTabModel();
|
this.route.params
|
||||||
this.dmp.project = new ProjectFormModel();
|
.pipe(takeUntil(this._destroyed))
|
||||||
this.dmp.funder = new FunderFormModel();
|
.subscribe((params: Params) => {
|
||||||
this.dmp.extraProperties = new ExtraPropertiesFormModel();
|
const itemId = params['id'];
|
||||||
this.dmp.extraProperties.visible = false;
|
|
||||||
this.dmp.extraProperties.contact = this.authService.current().id;
|
|
||||||
this.formGroup = this.dmp.buildForm();
|
|
||||||
|
|
||||||
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
if (itemId != null) {
|
||||||
|
this.isNew = false;
|
||||||
|
this.dmpService.getSingle(itemId).pipe(map(data => data as DmpModel))
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(async data => {
|
||||||
|
this.lockService.checkLockStatus(data.id).pipe(takeUntil(this._destroyed)).subscribe(lockStatus => {
|
||||||
|
this.lockStatus = lockStatus;
|
||||||
|
|
||||||
if (this.formGroup.get('profile')) { this.selectedDmpBlueprintDefinition = this.formGroup.get('profile').value; }
|
this.dmp = new DmpEditorModel();
|
||||||
this.registerFormEventsForDmpBlueprint();
|
this.dmp.grant = new GrantTabModel();
|
||||||
|
this.dmp.project = new ProjectFormModel();
|
||||||
|
this.dmp.funder = new FunderFormModel();
|
||||||
|
this.dmp.extraProperties = new ExtraPropertiesFormModel();
|
||||||
|
this.dmp.fromModel(data);
|
||||||
|
this.formGroup = this.dmp.buildForm();
|
||||||
|
|
||||||
if (!this.isUserOwner) {
|
this.datasets = this.formGroup.get('datasets') as FormArray;
|
||||||
this.formGroup.disable();
|
|
||||||
}
|
|
||||||
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('publicDate').value)) {
|
|
||||||
this.formGroup.get('extraProperties').get('publicDate').patchValue(new Date());
|
|
||||||
}
|
|
||||||
|
|
||||||
const principal = this.authService.current();
|
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||||
let associate: UserModel = {
|
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
||||||
id: principal.id,
|
this.dmpProfileService.getSingleBlueprint(this.formGroup.get('profile').value.id)
|
||||||
name: principal.name,
|
.pipe(takeUntil(this._destroyed))
|
||||||
appRoles: principal.authorities,
|
.subscribe(result => {
|
||||||
email: principal.email
|
this.selectedDmpBlueprintDefinition = result.definition;
|
||||||
};
|
this.formGroup.get('profile').setValue(result);
|
||||||
this.associates.push(associate);
|
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
|
||||||
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('contact').value)) {
|
this.step = 1;
|
||||||
this.formGroup.get('extraProperties').get('contact').patchValue(associate.id);
|
this.addProfiles(this.dmp.profiles);
|
||||||
}
|
});
|
||||||
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('language').value)) {
|
}
|
||||||
this.formGroup.get('extraProperties').get('language').patchValue('en');
|
this.maxStep = this.formGroup.get('datasets') ? this.maxStep + this.formGroup.get('datasets').value.length - 1 : this.maxStep;
|
||||||
}
|
|
||||||
|
|
||||||
try{
|
this.setIsUserOwner();
|
||||||
const profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
if (!this.isUserOwner) {
|
||||||
profiles.sort((a,b)=>a.label.localeCompare(b.label));
|
|
||||||
}catch{
|
if(this.isUserMember()){
|
||||||
console.info('Could not sort profiles');
|
this.router.navigate(['plans', 'overview', itemId]);
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
this.isFinalized = true;
|
||||||
|
this.formGroup.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.dmp.status === DmpStatus.Finalized || lockStatus) {
|
||||||
|
this.isFinalized = true;
|
||||||
|
this.formGroup.disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.authService.current() != null) {
|
||||||
|
if (!lockStatus) {
|
||||||
|
this.lock = new LockModel(data.id, this.getUserFromDMP());
|
||||||
|
|
||||||
|
this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => {
|
||||||
|
this.lock.id = Guid.parse(result);
|
||||||
|
interval(this.configurationService.lockInterval).pipe(takeUntil(this._destroyed)).subscribe(() => this.pumpLock());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.associatedUsers = data.associatedUsers;
|
||||||
|
this.people = data.users;
|
||||||
|
this.formGroup.valueChanges.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(x => {
|
||||||
|
this.formChanged();
|
||||||
|
});
|
||||||
|
if(this.lockStatus){
|
||||||
|
this.dialog.open(PopupNotificationDialogComponent,{data:{
|
||||||
|
title:this.language.instant('DMP-EDITOR.LOCKED.TITLE'),
|
||||||
|
message:this.language.instant('DMP-EDITOR.LOCKED.MESSAGE')
|
||||||
|
}, maxWidth:'30em'});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.dmp = new DmpEditorModel();
|
||||||
|
this.dmp.grant = new GrantTabModel();
|
||||||
|
this.dmp.project = new ProjectFormModel();
|
||||||
|
this.dmp.funder = new FunderFormModel();
|
||||||
|
this.dmp.extraProperties = new ExtraPropertiesFormModel();
|
||||||
|
this.dmp.extraProperties.visible = false;
|
||||||
|
this.dmp.extraProperties.contact = this.authService.current().id;
|
||||||
|
this.formGroup = this.dmp.buildForm();
|
||||||
|
|
||||||
|
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
|
||||||
|
|
||||||
|
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
||||||
|
this.dmpProfileService.getSingleBlueprint(this.formGroup.get('profile').value.id)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(result => {
|
||||||
|
this.selectedDmpBlueprintDefinition = result.definition;
|
||||||
|
this.formGroup.get('profile').setValue(result);
|
||||||
|
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
|
||||||
|
this.step = 1;
|
||||||
|
this.addProfiles();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.registerFormEventsForDmpBlueprint();
|
||||||
|
|
||||||
|
if (!this.isUserOwner) {
|
||||||
|
this.formGroup.disable();
|
||||||
|
}
|
||||||
|
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('publicDate').value)) {
|
||||||
|
this.formGroup.get('extraProperties').get('publicDate').patchValue(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
const principal = this.authService.current();
|
||||||
|
let associate: UserModel = {
|
||||||
|
id: principal.id,
|
||||||
|
name: principal.name,
|
||||||
|
appRoles: principal.authorities,
|
||||||
|
email: principal.email
|
||||||
|
};
|
||||||
|
this.associates.push(associate);
|
||||||
|
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('contact').value)) {
|
||||||
|
this.formGroup.get('extraProperties').get('contact').patchValue(associate.id);
|
||||||
|
}
|
||||||
|
if (isNullOrUndefined(this.formGroup.get('extraProperties').get('language').value)) {
|
||||||
|
this.formGroup.get('extraProperties').get('language').patchValue('en');
|
||||||
|
}
|
||||||
|
|
||||||
|
try{
|
||||||
|
const profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
||||||
|
profiles.sort((a,b)=>a.label.localeCompare(b.label));
|
||||||
|
}catch{
|
||||||
|
console.info('Could not sort profiles');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
this.profilesAutoCompleteConfiguration = {
|
this.profilesAutoCompleteConfiguration = {
|
||||||
filterFn: this.filterProfiles.bind(this),
|
filterFn: this.filterProfiles.bind(this),
|
||||||
|
@ -182,8 +293,104 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setIsUserOwner() {
|
||||||
|
if (this.dmp) {
|
||||||
|
const principal: Principal = this.authService.current();
|
||||||
|
this.isUserOwner = !!this.dmp.users.find(x => (x.role === Role.Owner) && (x.id === principal.id) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
isUserMember(): boolean{
|
||||||
|
try{
|
||||||
|
const principal: Principal = this.authService.current();
|
||||||
|
return !!this.dmp.users.find(x => (x.role === Role.Member) && (x.id === principal.id) );
|
||||||
|
}catch{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getUserFromDMP(): any {
|
||||||
|
if (this.dmp) {
|
||||||
|
const principal: Principal = this.authService.current();
|
||||||
|
return this.dmp.users.find(x => x.id === principal.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private pumpLock() {
|
||||||
|
this.lock.touchedAt = new Date();
|
||||||
|
this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => this.lock.id = Guid.parse(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
public isDirty(): boolean {
|
||||||
|
return this.formGroup && this.formGroup.dirty && this.hasChanges;
|
||||||
|
}
|
||||||
|
|
||||||
|
public discard() {
|
||||||
|
let messageText = "";
|
||||||
|
let confirmButtonText = "";
|
||||||
|
let cancelButtonText = "";
|
||||||
|
if (this.isNew) {
|
||||||
|
messageText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-NEW-MESSAGE');
|
||||||
|
confirmButtonText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-NEW-CONFIRM');
|
||||||
|
cancelButtonText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-NEW-DENY');
|
||||||
|
} else {
|
||||||
|
messageText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-EDITED-MESSAGE');
|
||||||
|
confirmButtonText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-EDITED-CONFIRM');
|
||||||
|
cancelButtonText = this.language.instant('DATASET-EDITOR.ACTIONS.DISCARD.DISCARD-EDITED-DENY');
|
||||||
|
}
|
||||||
|
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
||||||
|
restoreFocus: false,
|
||||||
|
data: {
|
||||||
|
message: messageText,
|
||||||
|
confirmButton: confirmButtonText,
|
||||||
|
cancelButton: cancelButtonText,
|
||||||
|
isDeleteConfirmation: true
|
||||||
|
},
|
||||||
|
maxWidth: '40em'
|
||||||
|
});
|
||||||
|
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
|
if (result) {
|
||||||
|
// this.backToDmp(this.formGroup.get('dmp').value.id)
|
||||||
|
setTimeout(x => {
|
||||||
|
this.discardChanges();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public discardChanges() {
|
||||||
|
this.isDiscarded = true;
|
||||||
|
this.hasChanges = false;
|
||||||
|
if (!this.isNew) {
|
||||||
|
let grantControl;
|
||||||
|
if (this.formGroup.get('grant').get('existGrant')) {
|
||||||
|
grantControl = new GrantTabModel();
|
||||||
|
grantControl.fromModel(this.formGroup.get('grant').get('existGrant').value);
|
||||||
|
} else {
|
||||||
|
grantControl = new GrantEditorModel();
|
||||||
|
grantControl.fromModel(this.formGroup.get('grant').value);
|
||||||
|
}
|
||||||
|
grantControl.buildForm()
|
||||||
|
|
||||||
|
this.formGroup.patchValue(JSON.parse(JSON.stringify(this.formGroupRawValue)));
|
||||||
|
|
||||||
|
if (this.formGroup.get('grant').get('existGrant')) {
|
||||||
|
this.formGroup.get('grant').get('existGrant').setValue(grantControl.existGrant);
|
||||||
|
} else {
|
||||||
|
this.formGroup.get('grant').setValue(grantControl);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.formGroup.reset();
|
||||||
|
this.formGroup.get("status").setValue(DmpStatus.Draft);
|
||||||
|
this.formGroup.get('extraProperties').get('visible').setValue(false);
|
||||||
|
this.formGroup.get('extraProperties').get('contact').setValue(this.authService.current().id);
|
||||||
|
this.formGroup.get('associatedUsers').setValue([]);
|
||||||
|
}
|
||||||
|
this.isDiscarded = false;
|
||||||
|
}
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
this.formSubmit(true);
|
this.formSubmit(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
formSubmit(addNew?: boolean, showAddDatasetDialog?: boolean): void {
|
formSubmit(addNew?: boolean, showAddDatasetDialog?: boolean): void {
|
||||||
|
@ -349,6 +556,9 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
// On save keep editor position
|
// On save keep editor position
|
||||||
this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
||||||
if (dmp) {
|
if (dmp) {
|
||||||
|
if(this.isNew){
|
||||||
|
this.router.navigate(['/plans', 'edit', dmp.id]);
|
||||||
|
}
|
||||||
let dmpEditorModel: DmpEditorModel;
|
let dmpEditorModel: DmpEditorModel;
|
||||||
dmpEditorModel = new DmpEditorModel();
|
dmpEditorModel = new DmpEditorModel();
|
||||||
dmpEditorModel.grant = new GrantTabModel();
|
dmpEditorModel.grant = new GrantTabModel();
|
||||||
|
@ -572,30 +782,7 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
.subscribe(Option => {
|
.subscribe(Option => {
|
||||||
if (Option instanceof Object) {
|
if (Option instanceof Object) {
|
||||||
this.selectedDmpBlueprintDefinition = Option.definition;
|
this.selectedDmpBlueprintDefinition = Option.definition;
|
||||||
for(let i = 0; i < this.selectedDmpBlueprintDefinition.sections.length; i++){
|
this.addProfiles();
|
||||||
this.sectionTemplates.push(new Array<DatasetProfileModel>());
|
|
||||||
}
|
|
||||||
const templates: Array<DmpDatasetProfile> = new Array<DmpDatasetProfile>();
|
|
||||||
this.selectedDmpBlueprintDefinition.sections.forEach(section => {
|
|
||||||
section.descriptionTemplates.forEach(template => {
|
|
||||||
this.sectionTemplates[section.ordinal - 1].push({id: template.descriptionTemplateId, label: template.label, description: ""})
|
|
||||||
let data: DmpDatasetProfileSectionsFormModel= new DmpDatasetProfileSectionsFormModel();
|
|
||||||
data.dmpSectionIndex.push(section.ordinal - 1);
|
|
||||||
let profile: DmpDatasetProfile = {
|
|
||||||
id: template.descriptionTemplateId,
|
|
||||||
label: template.label,
|
|
||||||
data: data
|
|
||||||
};
|
|
||||||
let found: DmpDatasetProfile = templates.find(dmpDatasetProfile => dmpDatasetProfile.id == profile.id);
|
|
||||||
if (found === undefined) {
|
|
||||||
templates.push(profile);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
found.data.dmpSectionIndex.push(section.ordinal - 1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
this.formGroup.get('profiles').setValue(templates);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
this.selectedDmpBlueprintDefinition = null;
|
this.selectedDmpBlueprintDefinition = null;
|
||||||
|
@ -603,6 +790,47 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private addProfiles(profiles?: DmpDatasetProfile[]) {
|
||||||
|
for(let i = 0; i < this.selectedDmpBlueprintDefinition.sections.length; i++){
|
||||||
|
this.sectionTemplates.push(new Array<DatasetProfileModel>());
|
||||||
|
}
|
||||||
|
const templates: Array<DmpDatasetProfile> = new Array<DmpDatasetProfile>();
|
||||||
|
this.selectedDmpBlueprintDefinition.sections.forEach(section => {
|
||||||
|
if (profiles !== undefined) {
|
||||||
|
profiles.filter(profile => profile.data.dmpSectionIndex.includes(section.ordinal - 1)).forEach(profile => this.sectionTemplates[section.ordinal - 1].push({id: profile.descriptionTemplateId, label: profile.label, description: ""}));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
section.descriptionTemplates.forEach(template => {
|
||||||
|
this.sectionTemplates[section.ordinal - 1].push({id: template.descriptionTemplateId, label: template.label, description: ""})
|
||||||
|
let found: DmpDatasetProfile = templates.find(dmpDatasetProfile => dmpDatasetProfile.id == template.descriptionTemplateId);
|
||||||
|
if (found === undefined) {
|
||||||
|
let data: DmpDatasetProfileSectionsFormModel= new DmpDatasetProfileSectionsFormModel();
|
||||||
|
data.dmpSectionIndex.push(section.ordinal - 1);
|
||||||
|
let id = null;
|
||||||
|
if (profiles !== undefined) {
|
||||||
|
let existedProfile = profiles.find(profile => profile.descriptionTemplateId == template.descriptionTemplateId);
|
||||||
|
if (existedProfile !== undefined) {
|
||||||
|
id = existedProfile.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let profile: DmpDatasetProfile = {
|
||||||
|
id: id,
|
||||||
|
descriptionTemplateId: template.descriptionTemplateId,
|
||||||
|
label: template.label,
|
||||||
|
data: data
|
||||||
|
};
|
||||||
|
templates.push(profile);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
found.data.dmpSectionIndex.push(section.ordinal - 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
(profiles !== undefined) ? this.formGroup.get('profiles').setValue(profiles) : this.formGroup.get('profiles').setValue(templates);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
dmpBlueprintAutoCompleteConfiguration: SingleAutoCompleteConfiguration = {
|
dmpBlueprintAutoCompleteConfiguration: SingleAutoCompleteConfiguration = {
|
||||||
filterFn: this.dmpBlueprintSearch.bind(this),
|
filterFn: this.dmpBlueprintSearch.bind(this),
|
||||||
initialItems: (extraData) => this.dmpBlueprintSearch(''),
|
initialItems: (extraData) => this.dmpBlueprintSearch(''),
|
||||||
|
@ -788,20 +1016,35 @@ export class DmpEditorBlueprintComponent extends BaseComponent implements OnInit
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
onOptionSelected(){
|
onOptionSelected(event, sectionIndex: number){
|
||||||
try{
|
try{
|
||||||
const profiles = this.formGroup.get('profiles').value as {id:string, label:string}[];
|
const profiles = this.formGroup.get('profiles').value as DmpDatasetProfile[];
|
||||||
const profileCounts: Map<String, number> = new Map<String, number>();
|
let found = profiles.find((value) => value.id === event.id);
|
||||||
profiles.forEach((value) => profileCounts.set(value.id, (profileCounts.get(value.id) !== undefined ? profileCounts.get(value.id): 0 ) + 1));
|
if(found !== undefined) {
|
||||||
const duplicateProfiles = profiles.filter((value) => {
|
if(found.data.dmpSectionIndex.indexOf(sectionIndex) === -1){
|
||||||
let isOk = profileCounts.get(value.id) > 1;
|
found.data.dmpSectionIndex.push(sectionIndex);
|
||||||
if (isOk) {
|
|
||||||
profileCounts.set(value.id, 0);
|
|
||||||
}
|
}
|
||||||
return isOk;
|
else{
|
||||||
});
|
this.sectionTemplates[sectionIndex].pop();
|
||||||
duplicateProfiles.forEach((value) => profiles.splice(profiles.lastIndexOf(value), 1));
|
}
|
||||||
profiles.sort((a,b)=> a.label.localeCompare(b.label));
|
}
|
||||||
|
else{
|
||||||
|
let dmpDatasetProfileSection: DmpDatasetProfileSectionsFormModel = new DmpDatasetProfileSectionsFormModel();
|
||||||
|
dmpDatasetProfileSection.dmpSectionIndex = [sectionIndex];
|
||||||
|
profiles.push({id: null, descriptionTemplateId: event.id, label: event.label, data: dmpDatasetProfileSection});
|
||||||
|
}
|
||||||
|
this.formGroup.get('profiles').setValue(profiles);
|
||||||
|
// const profileCounts: Map<String, number> = new Map<String, number>();
|
||||||
|
// profiles.forEach((value) => profileCounts.set(value.id, (profileCounts.get(value.id) !== undefined ? profileCounts.get(value.id): 0 ) + 1));
|
||||||
|
// const duplicateProfiles = profiles.filter((value) => {
|
||||||
|
// let isOk = profileCounts.get(value.id) > 1;
|
||||||
|
// if (isOk) {
|
||||||
|
// profileCounts.set(value.id, 0);
|
||||||
|
// }
|
||||||
|
// return isOk;
|
||||||
|
// });
|
||||||
|
// duplicateProfiles.forEach((value) => profiles.splice(profiles.lastIndexOf(value), 1));
|
||||||
|
// profiles.sort((a,b)=> a.label.localeCompare(b.label));
|
||||||
}catch{
|
}catch{
|
||||||
console.info('Could not sort Dataset Templates')
|
console.info('Could not sort Dataset Templates')
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ const routes: Routes = [
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'edit/:id',
|
path: 'edit/:id',
|
||||||
component: DmpEditorComponent,
|
component: DmpEditorBlueprintComponent,
|
||||||
data: {
|
data: {
|
||||||
breadcrumb: true,
|
breadcrumb: true,
|
||||||
title: 'GENERAL.TITLES.DMP-EDIT'
|
title: 'GENERAL.TITLES.DMP-EDIT'
|
||||||
|
@ -75,16 +75,6 @@ const routes: Routes = [
|
||||||
// breadcrumbs: 'new'
|
// breadcrumbs: 'new'
|
||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
// {
|
|
||||||
// path: 'new',
|
|
||||||
// component: DmpEditorComponent,
|
|
||||||
// canActivate: [AuthGuard],
|
|
||||||
// data: {
|
|
||||||
// breadcrumbs: 'new',
|
|
||||||
// title: 'GENERAL.TITLES.DMP-NEW'
|
|
||||||
// },
|
|
||||||
// canDeactivate:[CanDeactivateGuard]
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
path: 'new',
|
path: 'new',
|
||||||
component: DmpEditorBlueprintComponent,
|
component: DmpEditorBlueprintComponent,
|
||||||
|
|
|
@ -24,7 +24,7 @@ export class DmpEditorWizardModel {
|
||||||
this.label = item.label;
|
this.label = item.label;
|
||||||
this.status = item.status;
|
this.status = item.status;
|
||||||
this.description = item.description;
|
this.description = item.description;
|
||||||
this.datasetProfile = item.profiles[0];
|
this.datasetProfile = {id: item.profiles[0].descriptionTemplateId, label: item.profiles[0].label, description: ""};
|
||||||
this.language = item.language;
|
this.language = item.language;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue