diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/builder/UserDescriptionTemplateBuilder.java b/dmp-backend/core/src/main/java/eu/eudat/model/builder/UserDescriptionTemplateBuilder.java index 8100cdef4..25b62a521 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/builder/UserDescriptionTemplateBuilder.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/builder/UserDescriptionTemplateBuilder.java @@ -59,7 +59,7 @@ public class UserDescriptionTemplateBuilder extends BaseBuilder descriptionTemplateMap = this.collectDescriptionTemplates(descriptionTemplateFields, data); - FieldSet userFields = fields.extractPrefixed(this.asPrefix(Description._createdBy)); + FieldSet userFields = fields.extractPrefixed(this.asPrefix(UserDescriptionTemplate._user)); Map userItemsMap = this.collectUsers(userFields, data); List models = new ArrayList<>(); diff --git a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionTemplatePersist.java b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionTemplatePersist.java index cb21d765f..1fa0b8950 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionTemplatePersist.java +++ b/dmp-backend/core/src/main/java/eu/eudat/model/persist/DescriptionTemplatePersist.java @@ -186,7 +186,12 @@ public class DescriptionTemplatePersist { .must(() -> !this.isNull(item.getDefinition())) .failOn(DescriptionTemplatePersist._definition).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionTemplatePersist._definition}, LocaleContextHolder.getLocale())), this.refSpec() - .iff(() -> !this.isNull(item.getDefinition())) + .iff(() -> !this.isNull(item.getDefinition()) && !this.isListNullOrEmpty(item.getDefinition().getPages())) + .on(DescriptionTemplatePersist._definition) + .over(item.getDefinition()) + .using(() -> this.validatorFactory.validator(DefinitionPersist.DefinitionPersistValidator.class)), + this.refSpec() + .iff(() -> item.getStatus() == DescriptionTemplateStatus.Finalized) .on(DescriptionTemplatePersist._definition) .over(item.getDefinition()) .using(() -> this.validatorFactory.validator(DefinitionPersist.DefinitionPersistValidator.class)), diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java index ebc82ff5b..3ce020832 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DescriptionController.java @@ -116,7 +116,7 @@ public class DescriptionController { public Description publicGet(@PathVariable("id") UUID id, FieldSet fieldSet, Locale locale) throws MyApplicationException, MyForbiddenException, MyNotFoundException { logger.debug(new MapLogEntry("retrieving" + Description.class.getSimpleName()).And("id", id).And("fields", fieldSet)); - this.censorFactory.censor(DescriptionCensor.class).censor(fieldSet, null); + this.censorFactory.censor(PublicDescriptionCensor.class).censor(fieldSet); DescriptionQuery query = this.queryFactory.query(DescriptionQuery.class).authorize(EnumSet.of(Public)).ids(id).dmpSubQuery(this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public)); diff --git a/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts b/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts index 461d88ae2..183e6ad23 100644 --- a/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts +++ b/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts @@ -1,5 +1,6 @@ export enum RecentActivityOrder { UpdatedAt = 0, Label = 1, - Status = 2 + Status = 2, + Published = 3 } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/reference-type/description-template-editor-reference-type-field.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/reference-type/description-template-editor-reference-type-field.component.html index 55230f78e..03ca48bed 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/reference-type/description-template-editor-reference-type-field.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/components/field-type/reference-type/description-template-editor-reference-type-field.component.html @@ -1,21 +1,21 @@
-
{{'DESCRIPTION-TEMPLATE-EDITOR.FIELDS.REFERENCE-TYPE-TITLE' +
{{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.REFERENCE-TYPE-TITLE' | translate}}
- {{'DESCRIPTION-TEMPLATE-EDITOR.FIELDS.MULTIPLE-SELECT' | translate}} + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.MULTIPLE-SELECT' | translate}}
- {{'DESCRIPTION-TEMPLATE-EDITOR.FIELDS.LABEL' | translate}} + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.FIELD-LABEL' | translate}} {{form.get('data').get('label').getError('backendError').message}}
- {{'DESCRIPTION-TEMPLATE-EDITOR.FIELDS.REFERENCE-TYPE' | translate}} - + {{'DESCRIPTION-TEMPLATE-EDITOR.STEPS.FORM.FIELD.FIELDS.REFERENCE-TYPE' | translate}} + {{form.get('data').get('referenceTypeId').getError('backendError').message}} {{'GENERAL.VALIDATION.REQUIRED' | translate}} diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts index b803a5bf4..8274f9cec 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.ts @@ -221,6 +221,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor new UserDescriptionTemplateEditorModel( - this.validationErrorModel - ).fromModel(item).buildForm({ + (item, index) => item.buildForm({ rootPath: `users[${index}].` }) ), context.getValidation('users').validators @@ -77,7 +75,7 @@ export class DescriptionTemplateEditorModel extends BaseEditorModel implements D baseValidationArray.push({ key: 'type', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'type')] }); baseValidationArray.push({ key: 'type', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'type')] }); baseValidationArray.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'status')] }); - baseValidationArray.push({ key: 'users', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'users')] }); + baseValidationArray.push({ key: 'users', validators: [BackendErrorValidator(this.validationErrorModel, 'users')] }); baseValidationArray.push({ key: 'hash', validators: [] }); baseContext.validation = baseValidationArray; @@ -119,9 +117,9 @@ export class UserDescriptionTemplateEditorModel implements UserDescriptionTempla public validationErrorModel: ValidationErrorModel = new ValidationErrorModel() ) { } - public fromModel(item: UserDescriptionTemplatePersist): UserDescriptionTemplateEditorModel { + public fromModel(item: UserDescriptionTemplate): UserDescriptionTemplateEditorModel { if (item) { - this.userId = item.userId; + this.userId = item.user?.id; this.role = item.role; } return this; diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts index 64c584b00..5ff2b0da9 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.resolver.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { DescriptionTemplateType } from '@app/core/model/description-template-type/description-template-type'; -import { DescriptionTemplate, DescriptionTemplateBaseFieldData, DescriptionTemplateDefinition, DescriptionTemplateExternalDatasetData, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateLabelAndMultiplicityData, DescriptionTemplateMultiplicity, DescriptionTemplatePage, DescriptionTemplateReferenceTypeData, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData, DescriptionTemplateSelectOption, DescriptionTemplateUploadData, DescriptionTemplateUploadOption } from '@app/core/model/description-template/description-template'; +import { DescriptionTemplate, DescriptionTemplateBaseFieldData, DescriptionTemplateDefinition, DescriptionTemplateExternalDatasetData, DescriptionTemplateField, DescriptionTemplateFieldSet, DescriptionTemplateLabelAndMultiplicityData, DescriptionTemplateMultiplicity, DescriptionTemplatePage, DescriptionTemplateReferenceTypeData, DescriptionTemplateRule, DescriptionTemplateSection, DescriptionTemplateSelectData, DescriptionTemplateSelectOption, DescriptionTemplateUploadData, DescriptionTemplateUploadOption, UserDescriptionTemplate } from '@app/core/model/description-template/description-template'; import { ReferenceType } from '@app/core/model/reference-type/reference-type'; +import { User } from '@app/core/model/user/user'; import { DescriptionTemplateService } from '@app/core/services/description-template/description-template.service'; import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service'; import { BaseEditorResolver } from '@common/base/base-editor.resolver'; @@ -79,6 +80,10 @@ export class DescriptionTemplateEditorResolver extends BaseEditorResolver { [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.types), nameof(x => x.label)].join('.'), [nameof(x => x.definition), nameof(x => x.pages), nameof(x => x.sections), nameof(x => x.fieldSets), nameof(x => x.fields), nameof(x => x.data), nameof(x => x.types), nameof(x => x.value)].join('.'), + [nameof(x => x.users), nameof(x => x.descriptionTemplate), nameof(x => x.id)].join('.'), + [nameof(x => x.users), nameof(x => x.user), nameof(x => x.id),].join('.'), + [nameof(x => x.users), nameof(x => x.user), nameof(x => x.name),].join('.'), + [nameof(x => x.users), nameof(x => x.role),].join('.'), nameof(x => x.createdAt), diff --git a/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts b/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts index 544a6f0dd..69773ebf1 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts +++ b/dmp-frontend/src/app/ui/admin/description-template/listing/description-template-listing.component.ts @@ -94,11 +94,12 @@ export class DescriptionTemplateListingComponent extends BaseListingComponent(x => x.createdAt))] }; if (this.mode && this.mode == 'versions-listing') { lookup.groupIds = [Guid.parse(this.route.snapshot.paramMap.get('groupid'))]; lookup.versionStatuses = null; + }else{ + lookup.versionStatuses = [DescriptionTemplateVersionStatus.Current, DescriptionTemplateVersionStatus.NotFinalized]; } this.updateOrderUiFields(lookup.order); diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html index 8d0f3e40d..b09aabab0 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.html @@ -259,8 +259,6 @@
- {{'DMP-BLUEPRINT-EDITOR.SECTIONS-REQUIRED' | translate}} - {{formGroup.get('definition').get('sections').getError('backendError').message}} @@ -268,6 +266,8 @@
+ {{'DMP-BLUEPRINT-EDITOR.SECTIONS-REQUIRED' | translate}} + {{formGroup.get('definition').get('sections').getError('backendError').message}}
diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts index d0b3ee603..45d8026d3 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.component.ts @@ -138,6 +138,9 @@ export class DmpBlueprintEditorComponent extends BaseEditor { this.initModelFlags(d['action']); }); + if ((this.formGroup.get('definition').get('sections') as FormArray).length == 0) { + this.addSection(); + } } private initModelFlags(action: string): void { @@ -225,6 +228,7 @@ export class DmpBlueprintEditorComponent extends BaseEditor(x => x.createdAt))] }; if (this.mode && this.mode == 'versions-listing') { lookup.groupIds = [Guid.parse(this.route.snapshot.paramMap.get('groupid'))]; lookup.versionStatuses = null; + }else{ + lookup.versionStatuses = [DmpBlueprintVersionStatus.Current, DmpBlueprintVersionStatus.NotFinalized]; } this.updateOrderUiFields(lookup.order); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index 87c999d44..5494e5104 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -100,10 +100,11 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn } updateUrl() { - let parameters = "?type=dmps" + + // let parameters = "?type=dmps" + + let parameters = "" + (this.page != 1 ? "&page=" + this.page : "") + //TODO refactor - //(((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.PUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") + + (((this.formGroup.get("order").value != this.order.UpdatedAt && !this.publicMode) || (this.formGroup.get("order").value != this.order.Published && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") + (this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : ""); this.location.go(this.router.url.split('?')[0] + parameters); } diff --git a/dmp-frontend/src/app/ui/description/overview/description-overview.component.html b/dmp-frontend/src/app/ui/description/overview/description-overview.component.html index b9bc503ac..af852bb26 100644 --- a/dmp-frontend/src/app/ui/description/overview/description-overview.component.html +++ b/dmp-frontend/src/app/ui/description/overview/description-overview.component.html @@ -109,7 +109,7 @@

{{ 'DESCRIPTION-OVERVIEW.ACTIONS.REVERSE' | translate }}

-
+
diff --git a/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts b/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts index 91780c67a..4ab5c98a3 100644 --- a/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts +++ b/dmp-frontend/src/app/ui/description/overview/description-overview.component.ts @@ -11,7 +11,7 @@ import { DmpStatus } from '@app/core/common/enum/dmp-status'; import { DmpUserRole } from '@app/core/common/enum/dmp-user-role'; import { DescriptionTemplate } from '@app/core/model/description-template/description-template'; import { Description, DescriptionStatusPersist } from '@app/core/model/description/description'; -import { Dmp, DmpUser, DmpUserRemovePersist } from '@app/core/model/dmp/dmp'; +import { Dmp, DmpDescriptionTemplate, DmpUser, DmpUserRemovePersist } from '@app/core/model/dmp/dmp'; import { DmpReference } from '@app/core/model/dmp/dmp-reference'; import { Reference } from '@app/core/model/reference/reference'; import { AuthService } from '@app/core/services/auth/auth.service'; @@ -333,6 +333,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni formControl: formControl, descriptionId: this.description.id, descriptionTemplate: this.description.descriptionTemplate, + dmpDescriptionTemplate: this.description.dmpDescriptionTemplate, descriptionProfileExist: false, confirmButton: this.language.instant('DESCRIPTION-OVERVIEW.COPY-DIALOG.COPY'), cancelButton: this.language.instant('DESCRIPTION-OVERVIEW.COPY-DIALOG.CANCEL') @@ -438,6 +439,9 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni [nameof(x => x.descriptionTemplate), nameof(x => x.id)].join('.'), [nameof(x => x.descriptionTemplate), nameof(x => x.label)].join('.'), [nameof(x => x.descriptionTemplate), nameof(x => x.groupId)].join('.'), + [nameof(x => x.dmpDescriptionTemplate), nameof(x => x.id)].join('.'), + [nameof(x => x.dmpDescriptionTemplate), nameof(x => x.dmp), nameof(x => x.id)].join('.'), + [nameof(x => x.dmpDescriptionTemplate), nameof(x => x.sectionId)].join('.'), [nameof(x => x.dmp), nameof(x => x.id)].join('.'), [nameof(x => x.dmp), nameof(x => x.label)].join('.'), [nameof(x => x.dmp), nameof(x => x.accessType)].join('.'), 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 865bdce54..23554c911 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 @@ -151,7 +151,7 @@

{{ 'DMP-OVERVIEW.ACTIONS.REVERSE' | translate }}

-
+
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 968b81d2b..9b3982e1e 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 @@ -139,7 +139,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.isNew = false; this.isFinalized = true; this.isPublicView = true; - this.dmpService.getPublicSingle(itemId, this.lookupFields()) + this.dmpService.getPublicSingle(publicId, this.lookupFields()) .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index cdc2d7f04..9d5765fb7 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -397,6 +397,10 @@ "UNTITLED": "Untitled", "QUESTION": "Question", "TEMPLATE-OUTLINE": "Template outline", + "USERS": { + "NAME": "Name", + "ROLE": "Role" + }, "ERRORS": { "USER-NOT-FOUND": "User not found." } @@ -482,6 +486,10 @@ }, "FIELD": { "FIELDS": { + "FIELD-LABEL":"Label", + "REFERENCE-TYPE": "Reference Type", + "REFERENCE-TYPE-TITLE": "Reference Type", + "MULTIPLE-SELECT": "Multiple Select", "RULES-TITLE": "Conditional Questions", "FIELD-RULES-VALUE": "Value", "ID": "Section Unique Identifier", @@ -1671,6 +1679,8 @@ "CLONE": "Clone DMP Blueprint", "NEW-VERSION":"Create New Version of DMP Blueprint" }, + "SECTIONS-REQUIRED": "Required", + "FIELDS-REQUIRED": "Required", "FIELDS": { "TITLE": "Fields", "NAME": "Name", @@ -2321,6 +2331,10 @@ "CURRENCY": "Currency", "VALIDATION": "Validator" }, + "USER-DESCRIPTION-TEMPLATE-ROLE":{ + "OWNER":"Owner", + "MEMBER":"Member" + }, "DATASET-PROFILE-UPLOAD-TYPE": { "DOWNLOAD": "Download file" },