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 1fa0b8950..d4768c632 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 @@ -195,10 +195,6 @@ public class DescriptionTemplatePersist { .on(DescriptionTemplatePersist._definition) .over(item.getDefinition()) .using(() -> this.validatorFactory.validator(DefinitionPersist.DefinitionPersistValidator.class)), - this.spec() - .iff(() -> item.getStatus() == DescriptionTemplateStatus.Finalized) - .must(() -> !this.isListNullOrEmpty(item.getUsers())) - .failOn(DescriptionTemplatePersist._users).failWith(messageSource.getMessage("Validation_Required", new Object[]{DescriptionTemplatePersist._users}, LocaleContextHolder.getLocale())), this.navSpec() .iff(() -> !this.isListNullOrEmpty(item.getUsers())) .on(DescriptionTemplatePersist._users) diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java index 226f3b6ff..0010c044b 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/dmp/DmpServiceImpl.java @@ -563,7 +563,7 @@ public class DmpServiceImpl implements DmpService { public List assignUsers(UUID dmpId, List model, FieldSet fieldSet, boolean disableDelete) throws InvalidApplicationException, IOException { this.authorizationService.authorizeAtLeastOneForce(List.of(this.authorizationContentResolver.dmpAffiliation(dmpId)), Permission.AssignDmpUsers); - if (model == null || model.stream().noneMatch(x-> x.getUser() != null && DmpUserRole.Owner.equals(x.getRole()))) throw new MyApplicationException("At least one owner required"); + if (!disableDelete && (model == null || model.stream().noneMatch(x-> x.getUser() != null && DmpUserRole.Owner.equals(x.getRole())))) throw new MyApplicationException("At least one owner required"); DmpEntity dmpEntity = this.entityManager.find(DmpEntity.class, dmpId); if (dmpEntity == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{dmpId, Dmp.class.getSimpleName()}, LocaleContextHolder.getLocale())); diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockService.java b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockService.java index c63092e02..ec7b18c25 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockService.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockService.java @@ -25,5 +25,5 @@ public interface LockService { void unlock(UUID target) throws InvalidApplicationException; - void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException; + void deleteAndSave(UUID id, UUID target) throws MyForbiddenException, InvalidApplicationException; } diff --git a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java index 4bddf7b21..80595dbc8 100644 --- a/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java +++ b/dmp-backend/core/src/main/java/eu/eudat/service/lock/LockServiceImpl.java @@ -130,7 +130,7 @@ public class LockServiceImpl implements LockService { else { if (new Date().getTime() - Date.from(lock.getTouchedAt()).getTime() > lockProperties.getLockInterval()) { lockStatus.setStatus(false); - this.deleteAndSave(lock.getId()); + this.deleteAndSave(lock.getId(), lock.getTarget()); } else lockStatus.setStatus(true); } @@ -167,14 +167,14 @@ public class LockServiceImpl implements LockService { if (!lock.getLockedBy().equals(this.userScope.getUserId())) { throw new InvalidApplicationException("Only the user who created that lock can delete it"); } - this.deleteAndSave(lock.getId()); + this.deleteAndSave(lock.getId(), lock.getTarget()); } - public void deleteAndSave(UUID id) throws MyForbiddenException, InvalidApplicationException { + public void deleteAndSave(UUID id, UUID target) throws MyForbiddenException, InvalidApplicationException { logger.debug("deleting : {}", id); - AffiliatedResource affiliatedResourceDmp = this.authorizationContentResolver.dmpAffiliation(id); - AffiliatedResource affiliatedResourceDescription = this.authorizationContentResolver.descriptionAffiliation(id); + AffiliatedResource affiliatedResourceDmp = this.authorizationContentResolver.dmpAffiliation(target); + AffiliatedResource affiliatedResourceDescription = this.authorizationContentResolver.descriptionAffiliation(target); this.authorizationService.authorizeAtLeastOneForce(List.of(affiliatedResourceDmp, affiliatedResourceDescription), Permission.DeleteLock); this.deleterFactory.deleter(LockDeleter.class).deleteAndSaveByIds(List.of(id)); diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java index d372ec769..76f1d02b3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/LockController.java @@ -212,12 +212,12 @@ public class LockController { return true; } - @DeleteMapping("{id}") + @DeleteMapping("{id}/{target}") @Transactional - public void delete(@PathVariable("id") UUID id) throws MyForbiddenException, InvalidApplicationException { + public void delete(@PathVariable("id") UUID id, @PathVariable("id") UUID target) throws MyForbiddenException, InvalidApplicationException { logger.debug(new MapLogEntry("retrieving" + Lock.class.getSimpleName()).And("id", id)); - this.lockService.deleteAndSave(id); + this.lockService.deleteAndSave(id, target); this.auditService.track(AuditableAction.Lock_Delete, "id", id); } diff --git a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html index a11773afc..05dcb1d71 100644 --- a/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html +++ b/dmp-frontend/src/app/ui/admin/description-template/editor/description-template-editor.component.html @@ -325,16 +325,16 @@ {{'DESCRIPTION-TEMPLATE-EDITOR.ACTIONS.UPDATE' |translate}} expand_more --> - 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 cdb7bbcbe..a4aaf654f 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 @@ -60,6 +60,7 @@ export class DescriptionTemplateEditorComponent extends BaseEditor { + if (result) { + this.formGroup.get('status').setValue(DescriptionTemplateStatus.Finalized); + this.persistEntity(); + }}); + } + // // // Description Template User diff --git a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.model.ts b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.model.ts index 555acd5e7..c869ed68d 100644 --- a/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.model.ts +++ b/dmp-frontend/src/app/ui/admin/dmp-blueprint/editor/dmp-blueprint-editor.model.ts @@ -352,7 +352,7 @@ export class FieldInSectionEditorModel implements FieldInSectionPersist { id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], category: [{ value: this.category, disabled: disabled }, context.getValidation('category').validators], - label: [{ value: this.label, disabled: disabled }, this.category === DmpBlueprintFieldCategory.System ? context.getValidation('label-system').validators : context.getValidation('label-extra').validators], + label: [{ value: this.label, disabled: disabled }, this.category === DmpBlueprintFieldCategory.System ? context.getValidation('label-system').validators : ( this.category === DmpBlueprintFieldCategory.Extra ? context.getValidation('label-extra').validators : context.getValidation('label-external-reference').validators)], placeholder: [{ value: this.placeholder, disabled: disabled }, context.getValidation('placeholder').validators], description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], required: [{ value: this.required, disabled: disabled }, context.getValidation('required').validators], @@ -377,6 +377,7 @@ export class FieldInSectionEditorModel implements FieldInSectionPersist { baseValidationArray.push({ key: 'category', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}category`)] }); baseValidationArray.push({ key: 'label-system', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}label`)] }); baseValidationArray.push({ key: 'label-extra', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}label`)] }); + baseValidationArray.push({ key: 'label-external-reference', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}label`)] }); baseValidationArray.push({ key: 'placeholder', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}placeholder`)] }); baseValidationArray.push({ key: 'description', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}description`)] }); baseValidationArray.push({ key: 'semantics', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}semantics`)] }); @@ -406,7 +407,7 @@ export class FieldInSectionEditorModel implements FieldInSectionPersist { const control = formGroup?.get(keyField); control?.clearValidators(); if (keyField == 'label') { - control?.addValidators(context.has('label-system') ? context.getValidation('label-system').validators : context.getValidation('label-extra').validators); + control?.addValidators(context.has('label-system') ? context.getValidation('label-system').validators : (context.has('label-extra') ? context.getValidation('label-extra').validators : context.getValidation('label-external-reference').validators)); } else if (keyField == 'referenceTypeId') { if (formGroup.get('category').value == DmpBlueprintFieldCategory.ReferenceType) control?.addValidators([Validators.required, ...context.getValidation('referenceTypeId').validators]); else control?.addValidators([...context.getValidation('referenceTypeId').validators]);