From 0f9653cafc2c9ebf875cdd14cb7f39a0cdf48226 Mon Sep 17 00:00:00 2001 From: "CITE\\dtziotzios" Date: Fri, 12 Jul 2024 17:47:09 +0300 Subject: [PATCH] added annotations to Plan editor too. --- .../opencdmp/authorization/Permission.java | 4 +- ...ityTouchedIntegrationEventHandlerImpl.java | 13 ++-- .../src/main/resources/config/permissions.yml | 14 +++- .../app/core/common/enum/permission.enum.ts | 3 +- ...ion-template-preview-dialog.component.html | 2 +- ...n-template-editor-field-set.component.html | 2 +- .../final-preview.component.html | 2 +- .../form-annotation.service.ts} | 15 ++-- .../editor/description-editor.component.html | 2 +- .../editor/description-editor.component.ts | 10 +-- .../form-field-set.component.html | 2 +- .../form-field-set.component.ts | 12 ++-- .../form-section/form-section.component.html | 4 +- .../form-section/form-section.component.ts | 2 +- .../description-form.component.html | 2 +- .../description-form.component.ts | 9 +-- .../description-form.module.ts | 4 +- .../description-editor-entity.resolver.ts | 2 +- ...description-editor-permissions.resolver.ts | 6 +- .../description-overview.component.html | 2 +- .../description-overview.component.ts | 8 +-- .../plan-editor.component.html | 36 ++++++---- .../plan-editor.component.ts | 71 +++++++++++++++---- .../plan-editor.module.ts | 4 +- .../plan-editor-permissions.resolver.ts | 2 +- frontend/src/assets/i18n/baq.json | 3 +- frontend/src/assets/i18n/de.json | 3 +- frontend/src/assets/i18n/en.json | 3 +- frontend/src/assets/i18n/es.json | 3 +- frontend/src/assets/i18n/gr.json | 3 +- frontend/src/assets/i18n/hr.json | 3 +- frontend/src/assets/i18n/pl.json | 3 +- frontend/src/assets/i18n/pt.json | 3 +- frontend/src/assets/i18n/sk.json | 3 +- frontend/src/assets/i18n/sr.json | 3 +- frontend/src/assets/i18n/tr.json | 3 +- 36 files changed, 178 insertions(+), 88 deletions(-) rename frontend/src/app/ui/{description/editor/description-form/description-form-annotation.service.ts => annotations/annotation-dialog-component/form-annotation.service.ts} (89%) diff --git a/backend/core/src/main/java/org/opencdmp/authorization/Permission.java b/backend/core/src/main/java/org/opencdmp/authorization/Permission.java index 07014bda6..d9e50a204 100644 --- a/backend/core/src/main/java/org/opencdmp/authorization/Permission.java +++ b/backend/core/src/main/java/org/opencdmp/authorization/Permission.java @@ -85,6 +85,8 @@ public final class Permission { public static String UndoFinalizePlan = "UndoFinalizePlan"; public static String AssignPlanUsers = "AssignPlanUsers"; public static String InvitePlanUsers = "InvitePlanUsers"; + public static String AnnotatePlan = "AnnotatePlan"; + //PlanBlueprint public static String BrowsePlanBlueprint = "BrowsePlanBlueprint"; @@ -107,7 +109,7 @@ public final class Permission { //Description public static String BrowseDescription = "BrowseDescription"; - public static String ReviewDescription = "ReviewDescription"; + public static String AnnotateDescription = "AnnotateDescription"; public static String EditDescription = "EditDescription"; public static String FinalizeDescription = "FinalizeDescription"; public static String DeleteDescription = "DeleteDescription"; diff --git a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java index bc0291a09..2837151ce 100644 --- a/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java +++ b/backend/core/src/main/java/org/opencdmp/integrationevent/outbox/annotationentitytouch/AnnotationEntityTouchedIntegrationEventHandlerImpl.java @@ -5,12 +5,15 @@ import gr.cite.tools.fieldset.BaseFieldSet; import gr.cite.tools.logging.LoggerService; import org.opencdmp.commons.enums.IsActive; import org.opencdmp.data.DescriptionEntity; +import org.opencdmp.data.PlanEntity; import org.opencdmp.data.PlanUserEntity; import org.opencdmp.integrationevent.outbox.OutboxIntegrationEvent; import org.opencdmp.integrationevent.outbox.OutboxService; import org.opencdmp.model.PlanUser; import org.opencdmp.model.description.Description; +import org.opencdmp.model.plan.Plan; import org.opencdmp.query.DescriptionQuery; +import org.opencdmp.query.PlanQuery; import org.opencdmp.query.PlanUserQuery; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -60,16 +63,18 @@ public class AnnotationEntityTouchedIntegrationEventHandlerImpl implements Annot @Override public void handlePlan(UUID planId) { List descriptionEntities = this.queryFactory.query(DescriptionQuery.class).disableTracking().planIds(planId).collectAs(new BaseFieldSet().ensure(Description._id)); - if (descriptionEntities == null || descriptionEntities.isEmpty()) return; + PlanEntity planEntity = this.queryFactory.query(PlanQuery.class).disableTracking().ids(planId).firstAs(new BaseFieldSet().ensure(Plan._id, Plan._tenantId)); List planUsers = this.queryFactory.query(PlanUserQuery.class).disableTracking().planIds(planId).isActives(IsActive.Active).collectAs(new BaseFieldSet().ensure(PlanUser._user)); AnnotationEntitiesTouchedIntegrationEvent event = new AnnotationEntitiesTouchedIntegrationEvent(); event.setEvents(new ArrayList<>()); event.getEvents().add(this.buildEventItem(planId, planUsers)); - for (DescriptionEntity description : descriptionEntities) event.getEvents().add(this.buildEventItem(description.getId(), planUsers)); - - this.handle(event, descriptionEntities.getFirst().getTenantId()); + if (descriptionEntities != null) { + for (DescriptionEntity description : descriptionEntities) event.getEvents().add(this.buildEventItem(description.getId(), planUsers)); + } + + this.handle(event, planEntity.getTenantId()); } private AnnotationEntitiesTouchedIntegrationEvent.AnnotationEntityTouchedIntegrationEvent buildEventItem(UUID entityId, List planUsers){ diff --git a/backend/web/src/main/resources/config/permissions.yml b/backend/web/src/main/resources/config/permissions.yml index 19af56300..8615d20d4 100644 --- a/backend/web/src/main/resources/config/permissions.yml +++ b/backend/web/src/main/resources/config/permissions.yml @@ -199,7 +199,7 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false - ReviewDescription: + AnnotateDescription: roles: - Admin - TenantAdmin @@ -604,6 +604,18 @@ permissions: clients: [ ] allowAnonymous: false allowAuthenticated: false + AnnotatePlan: + roles: + - Admin + - TenantAdmin + plan: + roles: + - Owner + - DescriptionContributor + - Reviewer + clients: [ ] + allowAnonymous: false + allowAuthenticated: false # PlanBlueprint BrowsePlanBlueprint: roles: diff --git a/frontend/src/app/core/common/enum/permission.enum.ts b/frontend/src/app/core/common/enum/permission.enum.ts index db0040c1b..a57fa5b7e 100644 --- a/frontend/src/app/core/common/enum/permission.enum.ts +++ b/frontend/src/app/core/common/enum/permission.enum.ts @@ -81,6 +81,7 @@ export enum AppPermission { UndoFinalizePlan = "UndoFinalizePlan", AssignPlanUsers = "AssignPlanUsers", InvitePlanUsers = "InvitePlanUsers", + AnnotatePlan = "AnnotatePlan", //PlanBlueprint BrowsePlanBlueprint = "BrowsePlanBlueprint", @@ -103,7 +104,7 @@ export enum AppPermission { //Description BrowseDescription = "BrowseDescription", - ReviewDescription = "ReviewDescription", + AnnotateDescription = "AnnotateDescription", EditDescription = "EditDescription", FinalizeDescription = "FinalizeDescription", DeleteDescription = "DeleteDescription", diff --git a/frontend/src/app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component.html b/frontend/src/app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component.html index fe95666e8..29ee137a9 100644 --- a/frontend/src/app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component.html +++ b/frontend/src/app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component.html @@ -7,7 +7,7 @@
- +
diff --git a/frontend/src/app/ui/admin/description-template/editor/components/field-set/description-template-editor-field-set.component.html b/frontend/src/app/ui/admin/description-template/editor/components/field-set/description-template-editor-field-set.component.html index 797c6119e..0f3c9e850 100644 --- a/frontend/src/app/ui/admin/description-template/editor/components/field-set/description-template-editor-field-set.component.html +++ b/frontend/src/app/ui/admin/description-template/editor/components/field-set/description-template-editor-field-set.component.html @@ -123,7 +123,7 @@
- +
diff --git a/frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.html b/frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.html index 0250b3eb9..8a74775a2 100644 --- a/frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.html +++ b/frontend/src/app/ui/admin/description-template/editor/components/final-preview/final-preview.component.html @@ -1 +1 @@ - + diff --git a/frontend/src/app/ui/description/editor/description-form/description-form-annotation.service.ts b/frontend/src/app/ui/annotations/annotation-dialog-component/form-annotation.service.ts similarity index 89% rename from frontend/src/app/ui/description/editor/description-form/description-form-annotation.service.ts rename to frontend/src/app/ui/annotations/annotation-dialog-component/form-annotation.service.ts index 1fcfa1d86..4288d24aa 100644 --- a/frontend/src/app/ui/description/editor/description-form/description-form-annotation.service.ts +++ b/frontend/src/app/ui/annotations/annotation-dialog-component/form-annotation.service.ts @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { Annotation } from '@annotation-service/core/model/annotation.model'; import { AnnotationLookup } from '@annotation-service/core/query/annotation.lookup'; import { AnnotationService } from '@annotation-service/services/http/annotation.service'; -import { AnnotationEntityType } from '@app/core/common/enum/annotation-entity-type'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { BaseService } from '@common/base/base.service'; import { Guid } from '@common/types/guid'; @@ -15,9 +14,10 @@ import { nameof } from 'ts-simple-nameof'; @Injectable({ providedIn: 'any', }) -export class DescriptionFormAnnotationService extends BaseService { +export class FormAnnotationService extends BaseService { private entityId: Guid; + private entityType: string; private annotationsPerAnchor: Map; private annotationCountSubject: BehaviorSubject> = new BehaviorSubject>(null); private openAnnotationSubject: Subject = new Subject(); @@ -30,27 +30,28 @@ export class DescriptionFormAnnotationService extends BaseService { super(); } - init(entityId: Guid) { + init(entityId: Guid, entityType: string) { this.entityId = entityId; + this.entityType = entityType; this.refreshAnnotations(); } public getAnnotationCountObservable(): Observable> { return this.annotationCountSubject.asObservable(); } - + public getOpenAnnotationSubjectObservable(): Observable { return this.openAnnotationSubject.asObservable(); } public οpenAnnotationDialog(next: any): void { - this.openAnnotationSubject.next(next); - } + this.openAnnotationSubject.next(next); + } public refreshAnnotations() { const lookup: AnnotationLookup = new AnnotationLookup(); lookup.entityIds = [this.entityId]; - lookup.entityTypes = [AnnotationEntityType.Description]; + lookup.entityTypes = [this.entityType]; lookup.project = { fields: [ nameof(x => x.id), diff --git a/frontend/src/app/ui/description/editor/description-editor.component.html b/frontend/src/app/ui/description/editor/description-editor.component.html index 057b03d8f..cdd297aa8 100644 --- a/frontend/src/app/ui/description/editor/description-editor.component.html +++ b/frontend/src/app/ui/description/editor/description-editor.component.html @@ -177,7 +177,7 @@ [linkToScroll]="linkToScroll" [validationErrorModel]="editorModel.validationErrorModel" [isNew]="isNew || isCopy" - [canReview]="canReview" + [canAnnotate]="canAnnotate" [planUsers]="item?.plan?.planUsers ?? []" > diff --git a/frontend/src/app/ui/description/editor/description-editor.component.ts b/frontend/src/app/ui/description/editor/description-editor.component.ts index 3700ef61a..f3a2f244b 100644 --- a/frontend/src/app/ui/description/editor/description-editor.component.ts +++ b/frontend/src/app/ui/description/editor/description-editor.component.ts @@ -44,7 +44,7 @@ import { TableOfContentsService } from './table-of-contents/services/table-of-co import { TableOfContentsComponent } from './table-of-contents/table-of-contents.component'; import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; import { DescriptionFormService } from './description-form/components/services/description-form.service'; -import { DescriptionFormAnnotationService } from './description-form/description-form-annotation.service'; +import { FormAnnotationService } from '../../annotations/annotation-dialog-component/form-annotation.service'; @Component({ selector: 'app-description-editor-component', @@ -58,7 +58,7 @@ export class DescriptionEditorComponent extends BaseEditor x === AppPermission.EditDescription); - this.canReview = this.permissionPerSection && this.permissionPerSection[this.item.planDescriptionTemplate.sectionId.toString()] && this.permissionPerSection[this.item.planDescriptionTemplate.sectionId.toString()].some(x => x === AppPermission.ReviewDescription); + this.canAnnotate = this.permissionPerSection && this.permissionPerSection[this.item.planDescriptionTemplate.sectionId.toString()] && this.permissionPerSection[this.item.planDescriptionTemplate.sectionId.toString()].some(x => x === AppPermission.AnnotateDescription); this.formGroup = this.editorModel.buildForm(null, this.isDeleted || !this.canEdit, this.visibilityRulesService); if (this.item.descriptionTemplate?.definition) this.visibilityRulesService.setContext(this.item.descriptionTemplate.definition, this.formGroup.get('properties')); if (this.item.descriptionTemplate?.definition) this.pageToFieldSetMap = this.mapPageToFieldSet(this.item.descriptionTemplate);; diff --git a/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.html b/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.html index 2dea29470..08972bc7b 100644 --- a/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.html +++ b/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.html @@ -6,7 +6,7 @@
-
diff --git a/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.ts b/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.ts index bee62bdf2..8eaca0514 100644 --- a/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.ts +++ b/frontend/src/app/ui/description/editor/description-form/components/form-field-set/form-field-set.component.ts @@ -13,7 +13,7 @@ import { ValidationErrorModel } from '@common/forms/validation/error-model/valid import { Guid } from '@common/types/guid'; import { AnnotationDialogComponent } from '@app/ui/annotations/annotation-dialog-component/annotation-dialog.component'; import { AnnotationEntityType } from '@app/core/common/enum/annotation-entity-type'; -import { DescriptionFormAnnotationService } from '../../description-form-annotation.service'; +import { FormAnnotationService } from '../../../../../annotations/annotation-dialog-component/form-annotation.service'; import { DescriptionPropertyDefinitionFieldSet } from '@app/core/model/description/description'; import { DescriptionFormService } from '../services/description-form.service'; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; @@ -33,7 +33,7 @@ export class DescriptionFormFieldSetComponent extends BaseComponent { @Input() propertiesFormGroup: UntypedFormGroup; @Input() descriptionId: Guid; @Input() hideAnnotations: boolean = false; - @Input() canReview: boolean = false; + @Input() canAnnotate: boolean = false; @Input() numbering: string; @Input() planUsers: PlanUser[] = []; @@ -61,7 +61,7 @@ export class DescriptionFormFieldSetComponent extends BaseComponent { private routerUtils: RouterUtilsService, private dialog: MatDialog, private changeDetector: ChangeDetectorRef, - private descriptionFormAnnotationService: DescriptionFormAnnotationService, + private formAnnotationService: FormAnnotationService, private descriptionFormService: DescriptionFormService, private uiNotificationService: UiNotificationService, private language: TranslateService, @@ -72,7 +72,7 @@ export class DescriptionFormFieldSetComponent extends BaseComponent { ngOnInit() { this.descriptionFormService.getDetectChangesObservable().pipe(takeUntil(this._destroyed)).subscribe( _ => this.changeDetector.detectChanges() ); - this.descriptionFormAnnotationService.getAnnotationCountObservable().pipe(takeUntil(this._destroyed)).subscribe((annotationsPerAnchor: Map) => { + this.formAnnotationService.getAnnotationCountObservable().pipe(takeUntil(this._destroyed)).subscribe((annotationsPerAnchor: Map) => { const newCount = annotationsPerAnchor?.has(this.fieldSet.id) ? annotationsPerAnchor.get(this.fieldSet.id) : 0; if (newCount != this.annotationsCount) { this.annotationsCount = newCount; @@ -80,7 +80,7 @@ export class DescriptionFormFieldSetComponent extends BaseComponent { } }); - this.descriptionFormAnnotationService.getOpenAnnotationSubjectObservable().pipe(takeUntil(this._destroyed)).subscribe((anchorFieldsetId: string) => { + this.formAnnotationService.getOpenAnnotationSubjectObservable().pipe(takeUntil(this._destroyed)).subscribe((anchorFieldsetId: string) => { if (anchorFieldsetId && anchorFieldsetId == this.fieldSet.id) this.showAnnotations(anchorFieldsetId); }); @@ -191,7 +191,7 @@ export class DescriptionFormFieldSetComponent extends BaseComponent { }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(changesMade => { if (changesMade) { - this.descriptionFormAnnotationService.refreshAnnotations(); + this.formAnnotationService.refreshAnnotations(); } }); } diff --git a/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.html b/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.html index 88f405b18..f6d7f1190 100644 --- a/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.html +++ b/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.html @@ -24,7 +24,7 @@ [validationErrorModel]="validationErrorModel" [isChild]="false" [hideAnnotations]="isNew" - [canReview]="canReview" + [canAnnotate]="canAnnotate" [planUsers]="planUsers" > @@ -35,7 +35,7 @@
- +
diff --git a/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.ts b/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.ts index e2b43f9e3..6a27100a9 100644 --- a/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.ts +++ b/frontend/src/app/ui/description/editor/description-form/components/form-section/form-section.component.ts @@ -20,7 +20,7 @@ import { PlanUser } from '@app/core/model/plan/plan'; export class DescriptionFormSectionComponent extends BaseComponent implements OnInit, OnChanges { @Input() isNew: boolean = false; - @Input() canReview: boolean = false; + @Input() canAnnotate: boolean = false; @Input() section: DescriptionTemplateSection; @Input() propertiesFormGroup: UntypedFormGroup; @Input() visibilityRulesService: VisibilityRulesService; diff --git a/frontend/src/app/ui/description/editor/description-form/description-form.component.html b/frontend/src/app/ui/description/editor/description-form/description-form.component.html index b1119a46b..8126483d5 100644 --- a/frontend/src/app/ui/description/editor/description-form/description-form.component.html +++ b/frontend/src/app/ui/description/editor/description-form/description-form.component.html @@ -15,7 +15,7 @@
- +
diff --git a/frontend/src/app/ui/description/editor/description-form/description-form.component.ts b/frontend/src/app/ui/description/editor/description-form/description-form.component.ts index 4490a1ebe..7f6ec9896 100644 --- a/frontend/src/app/ui/description/editor/description-form/description-form.component.ts +++ b/frontend/src/app/ui/description/editor/description-form/description-form.component.ts @@ -6,9 +6,10 @@ import { BaseComponent } from '@common/base/base.component'; import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; import { Guid } from '@common/types/guid'; import { LinkToScroll } from '../table-of-contents/table-of-contents.component'; -import { DescriptionFormAnnotationService } from './description-form-annotation.service'; +import { FormAnnotationService } from '../../../annotations/annotation-dialog-component/form-annotation.service'; import { VisibilityRulesService } from './visibility-rules/visibility-rules.service'; import { PlanUser } from '@app/core/model/plan/plan'; +import { AnnotationEntityType } from '@app/core/common/enum/annotation-entity-type'; @Component({ selector: 'app-description-form', @@ -22,7 +23,7 @@ export class DescriptionFormComponent extends BaseComponent implements OnInit, O @Input() visibilityRulesService: VisibilityRulesService; @Input() descriptionId: Guid; @Input() isNew: boolean = false; - @Input() canReview: boolean = false; + @Input() canAnnotate: boolean = false; @Input() path: string; @Input() datasetDescription: String; @Input() linkToScroll: LinkToScroll; @@ -32,7 +33,7 @@ export class DescriptionFormComponent extends BaseComponent implements OnInit, O @Output() formChanged: EventEmitter = new EventEmitter(); constructor( - public descriptionFormAnnotationService: DescriptionFormAnnotationService, + public formAnnotationService: FormAnnotationService, ) { super(); @@ -45,7 +46,7 @@ export class DescriptionFormComponent extends BaseComponent implements OnInit, O ngOnChanges(changes: SimpleChanges) { this.init(); if (this.descriptionId != null) { - this.descriptionFormAnnotationService.init(this.descriptionId); + this.formAnnotationService.init(this.descriptionId, AnnotationEntityType.Description); } } diff --git a/frontend/src/app/ui/description/editor/description-form/description-form.module.ts b/frontend/src/app/ui/description/editor/description-form/description-form.module.ts index 0ab5ed407..73847140d 100644 --- a/frontend/src/app/ui/description/editor/description-form/description-form.module.ts +++ b/frontend/src/app/ui/description/editor/description-form/description-form.module.ts @@ -13,7 +13,7 @@ import { DescriptionFormFieldSetComponent } from './components/form-field-set/fo import { DescriptionFormFieldComponent } from './components/form-field/form-field.component'; import { DescriptionFormSectionComponent } from './components/form-section/form-section.component'; import { DescriptionFormComponent } from './description-form.component'; -import { DescriptionFormAnnotationService } from './description-form-annotation.service'; +import { FormAnnotationService } from '../../../annotations/annotation-dialog-component/form-annotation.service'; import { TagsFieldModule } from '@app/ui/tag/tags-field/tags-field.module'; import { DescriptionFormService } from './components/services/description-form.service'; @@ -43,7 +43,7 @@ import { DescriptionFormService } from './components/services/description-form.s DescriptionFormFieldSetComponent ], providers: [ - DescriptionFormAnnotationService, + FormAnnotationService, DescriptionFormService, ] }) diff --git a/frontend/src/app/ui/description/editor/resolvers/description-editor-entity.resolver.ts b/frontend/src/app/ui/description/editor/resolvers/description-editor-entity.resolver.ts index bc97377fa..9b9669e60 100644 --- a/frontend/src/app/ui/description/editor/resolvers/description-editor-entity.resolver.ts +++ b/frontend/src/app/ui/description/editor/resolvers/description-editor-entity.resolver.ts @@ -58,7 +58,7 @@ export class DescriptionEditorEntityResolver extends BaseEditorResolver { [nameof(x => x.authorizationFlags), AppPermission.EditDescription].join('.'), [nameof(x => x.authorizationFlags), AppPermission.DeleteDescription].join('.'), [nameof(x => x.authorizationFlags), AppPermission.FinalizeDescription].join('.'), - [nameof(x => x.authorizationFlags), AppPermission.ReviewDescription].join('.'), + [nameof(x => x.authorizationFlags), AppPermission.AnnotateDescription].join('.'), [nameof(x => x.planDescriptionTemplate), nameof(x => x.id)].join('.'), [nameof(x => x.planDescriptionTemplate), nameof(x => x.sectionId)].join('.'), diff --git a/frontend/src/app/ui/description/editor/resolvers/description-editor-permissions.resolver.ts b/frontend/src/app/ui/description/editor/resolvers/description-editor-permissions.resolver.ts index 5aa34d07f..2809a850b 100644 --- a/frontend/src/app/ui/description/editor/resolvers/description-editor-permissions.resolver.ts +++ b/frontend/src/app/ui/description/editor/resolvers/description-editor-permissions.resolver.ts @@ -40,7 +40,7 @@ export class DescriptionEditorPermissionsResolver extends BaseEditorResolver { const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { planId: description.plan.id, sectionIds: [description.planDescriptionTemplate.sectionId], - permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.ReviewDescription] + permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.AnnotateDescription] } return this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel).pipe(takeUntil(this._destroyed)); })); @@ -62,7 +62,7 @@ export class DescriptionEditorPermissionsResolver extends BaseEditorResolver { const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { planId: description.plan.id, sectionIds: [description.planDescriptionTemplate.sectionId], - permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.ReviewDescription] + permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.AnnotateDescription] } return this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel).pipe(takeUntil(this._destroyed)); })); @@ -90,7 +90,7 @@ export class DescriptionEditorPermissionsResolver extends BaseEditorResolver { const descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { planId: description.plan.id, sectionIds: [description.planDescriptionTemplate.sectionId], - permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.ReviewDescription] + permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.FinalizeDescription, AppPermission.AnnotateDescription] } return this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel).pipe(takeUntil(this._destroyed)); })); diff --git a/frontend/src/app/ui/description/overview/description-overview.component.html b/frontend/src/app/ui/description/overview/description-overview.component.html index 1724a0fb3..df002994b 100644 --- a/frontend/src/app/ui/description/overview/description-overview.component.html +++ b/frontend/src/app/ui/description/overview/description-overview.component.html @@ -44,7 +44,7 @@
-
+
diff --git a/frontend/src/app/ui/description/overview/description-overview.component.ts b/frontend/src/app/ui/description/overview/description-overview.component.ts index 668c65e5d..bc8cd86ec 100644 --- a/frontend/src/app/ui/description/overview/description-overview.component.ts +++ b/frontend/src/app/ui/description/overview/description-overview.component.ts @@ -70,7 +70,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni canEdit = false; canDelete = false; canFinalize = false; - canReview = false; + canAnnotate = false; canInvitePlanUsers = false; authorFocus: string; @@ -135,8 +135,8 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni this.canEdit = (this.authService.hasPermission(AppPermission.EditDescription) || this.description.authorizationFlags?.some(x => x === AppPermission.EditDescription)) && this.description.belongsToCurrentTenant != false; - this.canReview = (this.authService.hasPermission(AppPermission.ReviewDescription) || - this.description.authorizationFlags?.some(x => x === AppPermission.ReviewDescription)) && this.description.belongsToCurrentTenant != false; + this.canAnnotate = (this.authService.hasPermission(AppPermission.AnnotateDescription) || + this.description.authorizationFlags?.some(x => x === AppPermission.AnnotateDescription)) && this.description.belongsToCurrentTenant != false; this.canFinalize = (this.authService.hasPermission(AppPermission.FinalizeDescription) || this.description.authorizationFlags?.some(x => x === AppPermission.FinalizeDescription)) && this.description.belongsToCurrentTenant != false; @@ -485,7 +485,7 @@ export class DescriptionOverviewComponent extends BaseComponent implements OnIni [nameof(x => x.authorizationFlags), AppPermission.DeleteDescription].join('.'), [nameof(x => x.authorizationFlags), AppPermission.FinalizeDescription].join('.'), [nameof(x => x.authorizationFlags), AppPermission.InvitePlanUsers].join('.'), - [nameof(x => x.authorizationFlags), AppPermission.ReviewDescription].join('.'), + [nameof(x => x.authorizationFlags), AppPermission.AnnotateDescription].join('.'), [nameof(x => x.descriptionTemplate), nameof(x => x.id)].join('.'), [nameof(x => x.descriptionTemplate), nameof(x => x.label)].join('.'), diff --git a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.html b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.html index a3503ca66..b4860cfeb 100644 --- a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.html +++ b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.html @@ -10,7 +10,7 @@
{{ formGroup.get('label').value }} ({{'PLAN-EDITOR.UNSAVED-CHANGES' | translate}})
+
{{field.description}}
+
@@ -298,15 +309,16 @@
-
+ +
- + - +
@@ -372,4 +384,4 @@
- + \ No newline at end of file diff --git a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.ts b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.ts index 205a1f9f8..b0e5dc48a 100644 --- a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.ts +++ b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.component.ts @@ -4,7 +4,12 @@ import { FormArray, UntypedFormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; +import { AnnotationEntityType } from '@app/core/common/enum/annotation-entity-type'; import { DescriptionStatus } from '@app/core/common/enum/description-status'; +import { FileTransformerEntityType } from '@app/core/common/enum/file-transformer-entity-type'; +import { IsActive } from '@app/core/common/enum/is-active.enum'; +import { LockTargetType } from '@app/core/common/enum/lock-target-type'; +import { AppPermission } from '@app/core/common/enum/permission.enum'; import { PlanAccessType } from '@app/core/common/enum/plan-access-type'; import { PlanBlueprintFieldCategory } from '@app/core/common/enum/plan-blueprint-field-category'; import { PlanBlueprintExtraFieldDataType } from '@app/core/common/enum/plan-blueprint-field-type'; @@ -13,25 +18,24 @@ import { PlanBlueprintSystemFieldType } from '@app/core/common/enum/plan-bluepri import { PlanStatus } from '@app/core/common/enum/plan-status'; import { PlanUserRole } from '@app/core/common/enum/plan-user-role'; import { PlanUserType } from '@app/core/common/enum/plan-user-type'; -import { IsActive } from '@app/core/common/enum/is-active.enum'; -import { LockTargetType } from '@app/core/common/enum/lock-target-type'; -import { AppPermission } from '@app/core/common/enum/permission.enum'; import { DescriptionTemplate } from '@app/core/model/description-template/description-template'; import { DescriptionSectionPermissionResolver } from '@app/core/model/description/description'; -import { PlanBlueprint, PlanBlueprintDefinitionSection, FieldInSection } from '@app/core/model/plan-blueprint/plan-blueprint'; -import { Plan, PlanPersist } from '@app/core/model/plan/plan'; import { LanguageInfo } from '@app/core/model/language-info'; +import { FieldInSection, PlanBlueprint, PlanBlueprintDefinitionSection } from '@app/core/model/plan-blueprint/plan-blueprint'; +import { Plan, PlanPersist } from '@app/core/model/plan/plan'; import { AuthService } from '@app/core/services/auth/auth.service'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { LanguageInfoService } from '@app/core/services/culture/language-info-service'; import { DescriptionTemplateService } from '@app/core/services/description-template/description-template.service'; import { DescriptionService } from '@app/core/services/description/description.service'; -import { PlanBlueprintService } from '@app/core/services/plan/plan-blueprint.service'; -import { PlanService } from '@app/core/services/plan/plan.service'; +import { FileTransformerService } from '@app/core/services/file-transformer/file-transformer.service'; import { LockService } from '@app/core/services/lock/lock.service'; import { LoggingService } from '@app/core/services/logging/logging-service'; import { AnalyticsService } from '@app/core/services/matomo/analytics-service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { PlanBlueprintService } from '@app/core/services/plan/plan-blueprint.service'; +import { PlanService } from '@app/core/services/plan/plan.service'; +import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; import { UserService } from '@app/core/services/user/user.service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; @@ -39,6 +43,7 @@ import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/mu import { MultipleAutoCompleteCanRemoveItem } from '@app/library/auto-complete/multiple/multiple-auto-complete.component'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { DescriptionTemplatePreviewDialogComponent } from '@app/ui/admin/description-template/description-template-preview/description-template-preview-dialog.component'; +import { AnnotationDialogComponent } from '@app/ui/annotations/annotation-dialog-component/annotation-dialog.component'; import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service'; import { BaseEditor } from '@common/base/base-editor'; import { FormService } from '@common/forms/form-service'; @@ -49,13 +54,11 @@ import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { map, takeUntil } from 'rxjs/operators'; import { PlanContactPrefillDialogComponent } from '../plan-contact-prefill-dialog/plan-contact-prefill-dialog.component'; -import { PlanEditorModel, PlanFieldIndicator } from './plan-editor.model'; -import { PlanEditorEntityResolver } from './resolvers/plan-editor-enitity.resolver'; -import { PlanEditorService } from './plan-editor.service'; -import { RouterUtilsService } from '@app/core/services/router/router-utils.service'; -import { FileTransformerService } from '@app/core/services/file-transformer/file-transformer.service'; -import { FileTransformerEntityType } from '@app/core/common/enum/file-transformer-entity-type'; import { PlanFinalizeDialogComponent, PlanFinalizeDialogOutput } from '../plan-finalize-dialog/plan-finalize-dialog.component'; +import { PlanEditorModel, PlanFieldIndicator } from './plan-editor.model'; +import { PlanEditorService } from './plan-editor.service'; +import { PlanEditorEntityResolver } from './resolvers/plan-editor-enitity.resolver'; +import { FormAnnotationService } from '@app/ui/annotations/annotation-dialog-component/form-annotation.service'; @Component({ selector: 'app-plan-editor', @@ -72,6 +75,7 @@ export class PlanEditorComponent extends BaseEditor imple item: Plan; selectedBlueprint: PlanBlueprint; step: number = 0; + annotationsPerAnchor: Map = new Map(); //Enums descriptionStatusEnum = DescriptionStatus; @@ -147,6 +151,10 @@ export class PlanEditorComponent extends BaseEditor imple return this.isNew ? this.authService.hasPermission(AppPermission.NewPlan) : this.item.authorizationFlags?.some(x => x === AppPermission.EditPlan) || this.authService.hasPermission(AppPermission.EditPlan); } + protected canAnnotate(id: Guid): boolean { + return this.permissionPerSection && this.permissionPerSection[id.toString()] && this.permissionPerSection[id.toString()].some(x => x === AppPermission.AnnotatePlan); + } + private hasPermission(permission: AppPermission): boolean { return this.authService.hasPermission(permission) || this.item?.authorizationFlags?.some(x => x === permission) || this.editorModel?.permissions?.includes(permission); } @@ -180,6 +188,7 @@ export class PlanEditorComponent extends BaseEditor imple private analyticsService: AnalyticsService, private breadcrumbService: BreadcrumbService, public fileTransformerService: FileTransformerService, + private formAnnotationService: FormAnnotationService, ) { const descriptionLabel: string = route.snapshot.data['entity']?.label; if (descriptionLabel) { @@ -196,6 +205,16 @@ export class PlanEditorComponent extends BaseEditor imple this.permissionPerSection = this.route.snapshot.data['permissions'] as Map ?? new Map(); super.ngOnInit(); if (this.isNew === false && this.step === 0) this.nextStep(); + + this.formAnnotationService.init(this.item.id, AnnotationEntityType.Plan); + this.formAnnotationService.getAnnotationCountObservable().pipe(takeUntil(this._destroyed)).subscribe((annotationsPerAnchor: Map) => { + this.annotationsPerAnchor = annotationsPerAnchor; + }); + + this.formAnnotationService.getOpenAnnotationSubjectObservable().pipe(takeUntil(this._destroyed)).subscribe((anchorId: string) => { + if (anchorId && anchorId == this.item.id?.toString()) this.showAnnotations(anchorId); + }); + } getItem(itemId: Guid, successFunction: (item: Plan) => void) { @@ -687,7 +706,7 @@ export class PlanEditorComponent extends BaseEditor imple } }) - if (descriptionTemplatesGroupIdsWithMaxMultitplicity.length > 0 && descriptionTemplatesGroupIds.length > 0){ + if (descriptionTemplatesGroupIdsWithMaxMultitplicity.length > 0 && descriptionTemplatesGroupIds.length > 0) { const descriptionTemplatesWithoutMaxMultiplicity = descriptionTemplatesGroupIds.filter(x => !descriptionTemplatesGroupIdsWithMaxMultitplicity.map(y => y).includes(x)) || []; if (descriptionTemplatesWithoutMaxMultiplicity.length > 0 && this.formGroup.pristine) return true; } @@ -774,6 +793,30 @@ export class PlanEditorComponent extends BaseEditor imple } as MultipleAutoCompleteCanRemoveItem; } + // + // + // Annotations + // + // + showAnnotations(anchorId: string) { + const dialogRef = this.dialog.open(AnnotationDialogComponent, { + width: '40rem', + maxWidth: '90vw', + maxHeight: '90vh', + data: { + entityId: this.item.id, + anchor: anchorId, + entityType: AnnotationEntityType.Plan, + planUsers: this.item?.planUsers ?? [] + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(changesMade => { + if (changesMade) { + this.formAnnotationService.refreshAnnotations(); + } + }); + } + // // // Misc diff --git a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.module.ts b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.module.ts index a8ab9b1d1..bbb748d7d 100644 --- a/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.module.ts +++ b/frontend/src/app/ui/plan/plan-editor-blueprint/plan-editor.module.ts @@ -13,6 +13,7 @@ import { PlanEditorRoutingModule } from './plan-editor.routing'; import { PlanFormProgressIndicationModule } from './form-progress-indication/plan-form-progress-indication.module'; import { PlanDeleteDialogModule } from '../plan-delete-dialog/plan-delete-dialog.module'; import { PlanContactPrefillDialogModule } from '../plan-contact-prefill-dialog/plan-contact-prefill-dialog.module'; +import { AnnotationDialogModule } from '@app/ui/annotations/annotation-dialog-component/annotation-dialog.module'; @NgModule({ imports: [ @@ -28,7 +29,8 @@ import { PlanContactPrefillDialogModule } from '../plan-contact-prefill-dialog/p DragDropModule, PlanUserFieldModule, PlanFormProgressIndicationModule, - PlanContactPrefillDialogModule + PlanContactPrefillDialogModule, + AnnotationDialogModule ], declarations: [ PlanEditorComponent, diff --git a/frontend/src/app/ui/plan/plan-editor-blueprint/resolvers/plan-editor-permissions.resolver.ts b/frontend/src/app/ui/plan/plan-editor-blueprint/resolvers/plan-editor-permissions.resolver.ts index 9aff17970..3d1e60f33 100644 --- a/frontend/src/app/ui/plan/plan-editor-blueprint/resolvers/plan-editor-permissions.resolver.ts +++ b/frontend/src/app/ui/plan/plan-editor-blueprint/resolvers/plan-editor-permissions.resolver.ts @@ -34,7 +34,7 @@ export class PlanEditorPermissionsResolver extends BaseEditorResolver { let descriptionSectionPermissionResolverModel: DescriptionSectionPermissionResolver = { planId: data.id, sectionIds: data?.blueprint?.definition?.sections?.map(x => x.id), - permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription] + permissions: [AppPermission.EditDescription, AppPermission.DeleteDescription, AppPermission.AnnotatePlan] }; return this.descriptionService.getDescriptionSectionPermissions(descriptionSectionPermissionResolverModel).pipe(takeUntil(this._destroyed)); } diff --git a/frontend/src/assets/i18n/baq.json b/frontend/src/assets/i18n/baq.json index fffb8f5c3..7457abc80 100644 --- a/frontend/src/assets/i18n/baq.json +++ b/frontend/src/assets/i18n/baq.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Deskribapenarekin bete", diff --git a/frontend/src/assets/i18n/de.json b/frontend/src/assets/i18n/de.json index a94d43f08..a988bc3b3 100644 --- a/frontend/src/assets/i18n/de.json +++ b/frontend/src/assets/i18n/de.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Fill with description", diff --git a/frontend/src/assets/i18n/en.json b/frontend/src/assets/i18n/en.json index b001e56c5..b6f374e24 100644 --- a/frontend/src/assets/i18n/en.json +++ b/frontend/src/assets/i18n/en.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Fill with description", diff --git a/frontend/src/assets/i18n/es.json b/frontend/src/assets/i18n/es.json index 2fb15731d..94fc667da 100644 --- a/frontend/src/assets/i18n/es.json +++ b/frontend/src/assets/i18n/es.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Rellenar con la descripción", diff --git a/frontend/src/assets/i18n/gr.json b/frontend/src/assets/i18n/gr.json index 6f8e18605..748f2b041 100644 --- a/frontend/src/assets/i18n/gr.json +++ b/frontend/src/assets/i18n/gr.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Συμπληρώστε με περιγραφή", diff --git a/frontend/src/assets/i18n/hr.json b/frontend/src/assets/i18n/hr.json index e0b161e6c..5f461df23 100644 --- a/frontend/src/assets/i18n/hr.json +++ b/frontend/src/assets/i18n/hr.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Dodajte opis", diff --git a/frontend/src/assets/i18n/pl.json b/frontend/src/assets/i18n/pl.json index 1fca4514c..4c6ab979a 100644 --- a/frontend/src/assets/i18n/pl.json +++ b/frontend/src/assets/i18n/pl.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Dodaj opis", diff --git a/frontend/src/assets/i18n/pt.json b/frontend/src/assets/i18n/pt.json index 4bd18ecd5..a5d1fe18e 100644 --- a/frontend/src/assets/i18n/pt.json +++ b/frontend/src/assets/i18n/pt.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Preencha com a descrição", diff --git a/frontend/src/assets/i18n/sk.json b/frontend/src/assets/i18n/sk.json index 439842949..7b2aeee89 100644 --- a/frontend/src/assets/i18n/sk.json +++ b/frontend/src/assets/i18n/sk.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Doplniť opis", diff --git a/frontend/src/assets/i18n/sr.json b/frontend/src/assets/i18n/sr.json index 09c07b131..3b6bc64f7 100644 --- a/frontend/src/assets/i18n/sr.json +++ b/frontend/src/assets/i18n/sr.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Dodajte opis", diff --git a/frontend/src/assets/i18n/tr.json b/frontend/src/assets/i18n/tr.json index a8e1226d0..bc8401c4c 100644 --- a/frontend/src/assets/i18n/tr.json +++ b/frontend/src/assets/i18n/tr.json @@ -1735,7 +1735,8 @@ "SAVE-AND-CLOSE": "Save & Close", "SAVE-AND-CONTINUE": "Save & Continue", "REVERSE": "Undo Finalization", - "LOCKED": "Locked" + "LOCKED": "Locked", + "ANNOTATIONS": "Comment" }, "PLACEHOLDER": { "DESCRIPTION": "Açıklamaları Doldur",