From 63a68947ea910f34c1e340b6e11bdebb8947c428 Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:56:09 -0300 Subject: [PATCH 01/12] add vitest.test-setup.ts --- vitest.config.ts | 1 + vitest.test-setup.ts | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 vitest.test-setup.ts diff --git a/vitest.config.ts b/vitest.config.ts index d46556a..d1fa83c 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,5 +5,6 @@ export default defineConfig({ pool: 'forks', hookTimeout: 20000, exclude: [...defaultExclude.filter(val => val !== '**/cypress/**'), '**/templates/**', '**/resources/**'], + setupFiles: ['./vitest.test-setup.ts'], }, }); diff --git a/vitest.test-setup.ts b/vitest.test-setup.ts new file mode 100644 index 0000000..b94ccb0 --- /dev/null +++ b/vitest.test-setup.ts @@ -0,0 +1,6 @@ +import { vi } from 'vitest'; +import { defineDefaults } from 'generator-jhipster/testing'; + +defineDefaults({ + mockFactory: () => vi.fn(), +}); From 360c597203fdd784135541abcc312c7b2d7959a9 Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:56:20 -0300 Subject: [PATCH 02/12] add reproducible data to sample --- .../generate-sample/templates/samples/postgresql-mvc-jwt.jdl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.blueprint/generate-sample/templates/samples/postgresql-mvc-jwt.jdl b/.blueprint/generate-sample/templates/samples/postgresql-mvc-jwt.jdl index d5c164e..f04381b 100644 --- a/.blueprint/generate-sample/templates/samples/postgresql-mvc-jwt.jdl +++ b/.blueprint/generate-sample/templates/samples/postgresql-mvc-jwt.jdl @@ -6,6 +6,7 @@ application { devDatabaseType h2Disk enableHibernateCache false enableTranslation false + jwtSecretKey "ZjY4MTM4YjI5YzMwZjhjYjI2OTNkNTRjMWQ5Y2Q0Y2YwOWNmZTE2NzRmYzU3NTMwM2NjOTE3MTllOTM3MWRkMzcyYTljMjVmNmQ0Y2MxOTUzODc0MDhhMTlkMDIxMzI2YzQzZDM2ZDE3MmQ3NjVkODk3OTVmYzljYTQyZDNmMTQ=" testFrameworks [cypress] } @@ -13,12 +14,14 @@ application { } @EnableAudit +@ChangelogDate(20240000000000) entity Blog { name String required minlength(3) handle String required minlength(2) } @EnableAudit +@ChangelogDate(20240000000100) entity Post { title String required content TextBlob required @@ -26,6 +29,7 @@ entity Post { } @EnableAudit +@ChangelogDate(20240000000300) entity Tag { name String required minlength(2) } From 2071079c7e8d4115feee0923b0dbd54a54798045 Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:57:52 -0300 Subject: [PATCH 03/12] rework angular ui --- .../angular-audit/resources/package.json | 2 +- .../entity-audit-modal.component.html.ejs | 50 ++---- .../entity-audit-modal.component.ts.ejs | 94 +++++----- .../entity-audit.component.html.ejs | 161 ++++++++--------- .../entity-audit.component.ts.ejs | 165 +++++++++--------- 5 files changed, 225 insertions(+), 247 deletions(-) diff --git a/generators/angular-audit/resources/package.json b/generators/angular-audit/resources/package.json index 7658ecf..f7f05af 100644 --- a/generators/angular-audit/resources/package.json +++ b/generators/angular-audit/resources/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "ngx-diff": "6.0.1" + "ngx-diff": "8.0.4" } } diff --git a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs index 8613d79..043e5b3 100644 --- a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs +++ b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs @@ -1,44 +1,32 @@ diff --git a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.ts.ejs b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.ts.ejs index 5fb8537..c7e0a16 100644 --- a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.ts.ejs +++ b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.ts.ejs @@ -1,66 +1,52 @@ import { Component } from '@angular/core'; import { HttpResponse } from '@angular/common/http'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { InlineDiffComponent } from 'ngx-diff'; +import { UnifiedDiffComponent } from 'ngx-diff'; import SharedModule from 'app/shared/shared.module'; import { EntityAuditService } from './entity-audit.service'; import { EntityAuditEvent } from './entity-audit-event.model'; @Component({ - standalone: true, - selector: '<%= jhiPrefixDashed %>-entity-audit-modal', - templateUrl: './entity-audit-modal.component.html', - imports: [SharedModule, InlineDiffComponent], - styles: [` - /* NOTE: for now the ::ng-deep shadow-piercing descendant combinator is - * required because Angular defaults to emulated view encapsulation and - * preprocesses all component styles to approximate shadow scoping - * rules. This means these styles wouldn't apply to the HTML generated - * by ng-diff-match-patch. - * - * This shouldn't be required when browsers support native - * encapsulation, at which point ::ng-deep will also be deprecated/removed - * see https://angular.io/guide/component-styles - */ - - :host ::ng-deep ins { - color: black; - background: #bbffbb; - } - - :host ::ng-deep del { - color: black; - background: #ffbbbb; - } - - .code { - background: #dcdada; - padding: 10px; - } - `] + standalone: true, + selector: '<%= jhiPrefixDashed %>-entity-audit-modal', + templateUrl: './entity-audit-modal.component.html', + imports: [SharedModule, UnifiedDiffComponent], + styles: [ + ` + @import 'ngx-diff/styles/default-theme'; + + ins { + color: black; + background-color: var(--ngx-diff-inserted-background-color); + } + + del { + color: black; + background-color: var(--ngx-diff-deleted-background-color); + } + `, + ], }) export default class EntityAuditModalComponent { - action?: string; - left?: string; - right?: string; - - constructor( - private service: EntityAuditService, - public activeModal: NgbActiveModal - ) {} - - openChange(audit: EntityAuditEvent): void { - this.service.getPrevVersion( - audit.entityType, audit.entityId, audit.commitVersion! - ).subscribe((res: HttpResponse) => { - const data: EntityAuditEvent = res.body!; - const previousVersion = JSON.stringify(JSON.parse(data.entityValue ?? '{}'), null, 2); - const currentVersion = JSON.stringify(audit.entityValue, null, 2); - - this.action = audit.action; - this.left = previousVersion; - this.right = currentVersion; - }); - } + action?: string; + left?: string; + right?: string; + + constructor( + private service: EntityAuditService, + public activeModal: NgbActiveModal, + ) {} + + openChange(audit: EntityAuditEvent): void { + this.service.getPrevVersion(audit.entityType, audit.entityId, audit.commitVersion!).subscribe((res: HttpResponse) => { + const data: EntityAuditEvent = res.body!; + const previousVersion = JSON.stringify(JSON.parse(data.entityValue ?? '{}'), null, 2); + const currentVersion = JSON.stringify(audit.entityValue, null, 2); + + this.action = audit.action; + this.left = previousVersion; + this.right = currentVersion; + }); + } } diff --git a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.html.ejs b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.html.ejs index 2a35aec..54a9217 100644 --- a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.html.ejs +++ b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.html.ejs @@ -1,110 +1,115 @@
- <%= jhiPrefix %>Translate="entityAudit.home.title"<% } %>>Entity Audit +

Translate="entityAudit.home.title">Entity Audit

- <<%= jhiPrefixDashed %>-alert>-alert> +
- <%= jhiPrefix %>Translate="entityAudit.home.filter"<% } %>>Filter +

Translate="entityAudit.home.filter">Filter

-
-
-
-

<%= jhiPrefix %>Translate="entityAudit.result.showInfo" [translateValues]="{ limit: selectedLimit, entity: selectedEntity }"<% } %>> - Last {{ selectedLimit }} - Changes for {{ selectedEntity }} -

+
+ @if (audits().length > 0) { +
+

Translate="entityAudit.result.showInfo" [translateValues]="{ limit: selectedLimit(), entity: selectedEntity() }"> + Last {{ selectedLimit() }} Changes for {{ selectedEntity() }} +

-
+
- - Translate="entityAudit.result.searchFieldLabel"> Filter: + + placeholder="{{ 'entityAudit.result.entityIdFilter' | translate }}" + [ngModel]="filterEntityId()" + (ngModelChange)="filterEntityId.set($event)" + />
-
+ - +
- - - - - <%= jhiPrefix %>Translate="entityAudit.result.tableHeader.value"<% } %>> - Value - - - + + + + + + + - + - - - - - - - - - + @for (audit of audits(); track audit.id) { + + + + + + + + + + } -
<%= jhiPrefix %>Translate="entityAudit.result.tableHeader.entityId"<% } %>> - Entity Id - <%= jhiPrefix %>Translate="entityAudit.result.tableHeader.action"<% } %>> - Action - <%= jhiPrefix %>Translate="entityAudit.result.tableHeader.version"<% } %>> - Version - <%= jhiPrefix %>Translate="entityAudit.result.tableHeader.modifiedDate"<% } %>> - Modified Date - <%= jhiPrefix %>Translate="entityAudit.result.tableHeader.modifiedBy"<% } %>> - Modified By -
Translate="entityAudit.result.tableHeader.entityId">Entity IdTranslate="entityAudit.result.tableHeader.action">ActionTranslate="entityAudit.result.tableHeader.version">VersionTranslate="entityAudit.result.tableHeader.value">ValueTranslate="entityAudit.result.tableHeader.modifiedDate">Modified DateTranslate="entityAudit.result.tableHeader.modifiedBy">Modified By
{{ audit.entityId }}{{ audit.action }}{{ audit.commitVersion }}
{{ audit.entityValue | json }}
{{ audit.modifiedDate | date:'medium' }}{{ audit.modifiedBy }} - -
{{ audit.entityId }}{{ audit.action }}{{ audit.commitVersion }} +
{{ audit.entityValue | json }}
+
{{ audit.modifiedDate | date: 'medium' }}{{ audit.modifiedBy }} + +
+
-

<%= jhiPrefix %>Translate="entityAudit.result.noDataFound"<% } %> class="mt-2"> - No Data found for the filters -

+ } @else { +

Translate="entityAudit.result.noDataFound" class="mt-2">No Data found for the filters

+ }
diff --git a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.ts.ejs b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.ts.ejs index 59b4c96..44d846d 100644 --- a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.ts.ejs +++ b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit.component.ts.ejs @@ -1,107 +1,106 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, computed, inject, signal } from '@angular/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { FormsModule } from '@angular/forms'; import { tap } from 'rxjs'; import SharedModule from 'app/shared/shared.module'; +import { AlertService } from 'app/core/util/alert.service'; import { EntityAuditService } from './entity-audit.service'; import { EntityAuditEvent } from './entity-audit-event.model'; import EntityAuditModalComponent from './entity-audit-modal.component'; -import { AlertService } from 'app/core/util/alert.service'; @Component({ - standalone: true, - selector: '<%= jhiPrefixDashed %>-entity-audit', - templateUrl: './entity-audit.component.html', - imports: [SharedModule, FormsModule, EntityAuditModalComponent], - styles: [` + standalone: true, + selector: '<%= jhiPrefixDashed %>-entity-audit', + templateUrl: './entity-audit.component.html', + imports: [SharedModule, FormsModule, EntityAuditModalComponent], + styles: [ + ` .code { background: #dcdada; padding: 10px; } - `], + `, + ], }) export default class EntityAuditComponent implements OnInit { - audits: EntityAuditEvent[] = []; - entities: string[] = []; - selectedEntity?: string; - limits = [25, 50, 100, 200]; - selectedLimit = this.limits[0]; - loading = false; - filterEntityId = ''; - orderProp: keyof EntityAuditEvent = 'entityId'; - ascending = true; - - constructor( - private modalService: NgbModal, - private service: EntityAuditService, - private alertService: AlertService - ) {} - - ngOnInit(): void { - this.service.getAllAudited().subscribe(entities => { - this.entities = entities; - }); - } - - loadChanges(): void { - if (!this.selectedEntity) { - return; + entities = signal([]); + selectedEntity = signal(undefined); + limits = [25, 50, 100, 200]; + selectedLimit = signal(this.limits[0]); + loading = signal(false); + filterEntityId = signal(''); + private _audits = signal([]); + private orderProp = signal('entityId'); + private ascending = signal(true); + audits = computed(() => { + const filterEntityId = this.filterEntityId(); + const orderProp = this.orderProp(); + const ascending = this.ascending(); + return this._audits() + .filter(audit => !filterEntityId || audit.entityId.toString() === filterEntityId) + .sort((a, b) => { + const aOrderProp = a[orderProp]; + const bOrderProp = b[orderProp]; + if (aOrderProp === bOrderProp) { + return 0; } - this.loading = true; - this.service.findByEntity(this.selectedEntity, this.selectedLimit) - .pipe(tap(() => (this.loading = false))) - .subscribe(res => { - const data = res.body ?? []; - this.audits = data.map((it: EntityAuditEvent) => { - it.entityValue = JSON.parse(it.entityValue ?? '{}'); - return it; - }); - }); - } + if (aOrderProp === undefined || aOrderProp < bOrderProp) { + return ascending ? -1 : 1; + } + return ascending ? 1 : -1; + }); + }); - trackId(index: number, item: EntityAuditEvent): number { - return item.id; - } + private modalService = inject(NgbModal); + private service = inject(EntityAuditService); + private alertService = inject(AlertService); - openChange(audit: EntityAuditEvent): void { - if (!audit.commitVersion || audit.commitVersion < 2) { - this.alertService.addAlert({ - type: 'warning', - <%_ if (enableTranslation) { _%> - translationKey: 'entityAudit.result.firstAuditEntry', - <%_ } else { _%> - message: 'There is no previous version available for this entry.\n' + - 'This is the first audit entry captured for this object.', - <%_ } _%> - }); - } else { - const modalRef = this.modalService.open(EntityAuditModalComponent); - modalRef.componentInstance.openChange(audit); - } - } + ngOnInit(): void { + this.service.getAllAudited().subscribe(entities => { + this.entities.set(entities); + }); + } - orderBy(orderProp: keyof EntityAuditEvent): void { - this.ascending = this.orderProp === orderProp ? !this.ascending : true; - this.orderProp = orderProp; + loadChanges(): void { + const selectedEntity = this.selectedEntity(); + if (!selectedEntity) { + return; } + this.loading.set(true); + this.service + .findByEntity(selectedEntity, this.selectedLimit()) + .pipe(tap(() => this.loading.set(false))) + .subscribe(res => { + const data = res.body ?? []; + this._audits.set( + data.map((it: EntityAuditEvent) => { + it.entityValue = JSON.parse(it.entityValue ?? '{}'); + return it; + }), + ); + }); + } - getAudits(): EntityAuditEvent[] { - return this.audits - .filter(audit => !this.filterEntityId || audit.entityId.toString() === this.filterEntityId) - .sort((a, b) => { - const aOrderProp = a[this.orderProp]; - const bOrderProp = b[this.orderProp]; - if ( - (aOrderProp === undefined && bOrderProp === undefined) || - (aOrderProp !== undefined && bOrderProp !== undefined && aOrderProp === bOrderProp) - ) { - return 0; - } - if (aOrderProp === undefined || aOrderProp < bOrderProp) { - return this.ascending ? -1 : 1; - } - return this.ascending ? 1 : -1; - }); + openChange(audit: EntityAuditEvent): void { + if (!audit.commitVersion || audit.commitVersion < 2) { + this.alertService.addAlert({ + type: 'warning', +<%_ if (enableTranslation) { _%> + translationKey: 'entityAudit.result.firstAuditEntry', +<%_ } else { _%> + message: 'There is no previous version available for this entry.\n' + + 'This is the first audit entry captured for this object.', +<%_ } _%> + }); + } else { + const modalRef = this.modalService.open(EntityAuditModalComponent, { size: 'lg' }); + modalRef.componentInstance.openChange(audit); } + } + + orderBy(orderProp: keyof EntityAuditEvent): void { + this.ascending.update(ascending => (this.orderProp() === orderProp ? !ascending : true)); + this.orderProp.set(orderProp); + } } From 1f355deb4f47bfa350a2c6f2af4757a356183217 Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:58:00 -0300 Subject: [PATCH 04/12] fix translationKey --- generators/angular-audit/generator.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/angular-audit/generator.js b/generators/angular-audit/generator.js index 53de214..b84cb81 100644 --- a/generators/angular-audit/generator.js +++ b/generators/angular-audit/generator.js @@ -67,7 +67,7 @@ export default class extends BaseApplicationGenerator { source.addItemToAdminMenu?.({ icon: 'list-alt', route: 'admin/entity-audit', - translationKey: 'entityAudit', + translationKey: 'global.menu.admin.entityAudit', name: 'Entity Audit', }); }, From 94d31cdd1cc5d7377e3a7c9a71eee7c7ac5fbfdd Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:58:32 -0300 Subject: [PATCH 05/12] fix auditedEntities for custom entity packages --- generators/spring-boot-javers/generator.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generators/spring-boot-javers/generator.js b/generators/spring-boot-javers/generator.js index df78410..c536901 100644 --- a/generators/spring-boot-javers/generator.js +++ b/generators/spring-boot-javers/generator.js @@ -21,7 +21,9 @@ export default class extends BaseApplicationGenerator { get [BaseApplicationGenerator.DEFAULT]() { return this.asDefaultTaskGroup({ async defaultTask({ application, entities }) { - application.auditedEntities = entities.map(e => e.persistClass); + application.auditedEntities = entities + .filter(e => e.enableAudit) + .map(e => `${e.entityPackage ? `${e.entityPackage}.` : ''}domain.${e.persistClass}`); }, }); } From 409fc8b5179ad1ad17f03bf7a3e4a8e7d608153b Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:58:49 -0300 Subject: [PATCH 06/12] convert entity ids --- .../rest/JaversEntityAuditResource.java.ejs | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/generators/spring-boot-javers/templates/src/main/java/_package_/web/rest/JaversEntityAuditResource.java.ejs b/generators/spring-boot-javers/templates/src/main/java/_package_/web/rest/JaversEntityAuditResource.java.ejs index 92495c7..c462370 100644 --- a/generators/spring-boot-javers/templates/src/main/java/_package_/web/rest/JaversEntityAuditResource.java.ejs +++ b/generators/spring-boot-javers/templates/src/main/java/_package_/web/rest/JaversEntityAuditResource.java.ejs @@ -5,15 +5,19 @@ import <%=packageName%>.security.AuthoritiesConstants; import tech.jhipster.web.util.PaginationUtil; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; import org.javers.core.Javers; import org.javers.core.metamodel.object.CdoSnapshot; import org.javers.repository.jql.QueryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.support.JpaEntityInformationSupport; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -39,10 +43,16 @@ public class JaversEntityAuditResource { private final Logger log = LoggerFactory.getLogger(JaversEntityAuditResource.class); + @PersistenceContext + private EntityManager manager; + private final Javers javers; - public JaversEntityAuditResource(Javers javers) { + private final ConversionService conversionService; + + public JaversEntityAuditResource(Javers javers, ConversionService conversionService) { this.javers = javers; + this.conversionService = conversionService; } /** @@ -75,7 +85,7 @@ public class JaversEntityAuditResource { throws ClassNotFoundException { log.debug("REST request to get a page of EntityAuditEvents"); - Class entityTypeToFetch = Class.forName("<%=packageName%>.domain." + entityType); + var entityTypeToFetch = Class.forName("<%=packageName%>." + entityType); QueryBuilder jqlQuery = QueryBuilder.byClass(entityTypeToFetch) .limit(limit); @@ -111,13 +121,12 @@ public class JaversEntityAuditResource { @RequestParam(value = "commitVersion") Long commitVersion) throws ClassNotFoundException { - Class entityTypeToFetch = Class.forName("<%=packageName%>.domain." + qualifiedName); - - QueryBuilder jqlQuery = QueryBuilder.byInstanceId(entityId, entityTypeToFetch) - .limit(1) - .withVersion(commitVersion - 1); + var entityTypeToFetch = Class.forName("<%- packageName %>." + qualifiedName); + var entityInformation = JpaEntityInformationSupport.getEntityInformation(entityTypeToFetch, manager); + var id = conversionService.convert(entityId, entityInformation.getIdType()); - EntityAuditEvent prev = EntityAuditEvent.fromJaversSnapshot(javers.findSnapshots(jqlQuery.build()).get(0)); + var jqlQuery = QueryBuilder.byInstanceId(id, entityTypeToFetch).limit(1).withVersion(commitVersion - 1); + var prev = EntityAuditEvent.fromJaversSnapshot(javers.findSnapshots(jqlQuery.build()).get(0)); return new ResponseEntity<>(prev, HttpStatus.OK); From 5a3422d5a2af26f240912eeca3c36c41072d0805 Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 11:59:17 -0300 Subject: [PATCH 07/12] write native language --- generators/languages/generator.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/generators/languages/generator.js b/generators/languages/generator.js index eaf79ba..7621f7b 100644 --- a/generators/languages/generator.js +++ b/generators/languages/generator.js @@ -13,10 +13,13 @@ export default class extends BaseApplicationGenerator { get [BaseApplicationGenerator.WRITING]() { return this.asWritingTaskGroup({ - async writingTemplateTask({ application: { languages = [], clientSrcDir } }) { + async writingTemplateTask({ application: { languages = [], nativeLanguage, clientSrcDir } }) { if (!clientSrcDir) { throw new Error('clientSrcDir is missing'); } + if (!languages.includes(nativeLanguage)) { + languages.unshift(nativeLanguage); + } const templates = languages.map(language => { const sourceLanguage = existsSync(`${this.templatePath()}/${TEMPLATES_WEBAPP_SOURCES_DIR}i18n/${language}/entity-audit.json`) ? language From 43f58a729249fa006794f853b3831b8e8433b69d Mon Sep 17 00:00:00 2001 From: Marcelo Shima Date: Wed, 10 Apr 2024 12:14:33 -0300 Subject: [PATCH 08/12] translate pages --- .../entity-audit-modal.component.html.ejs | 8 +++--- .../entity-audit.component.html.ejs | 28 +++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs index 043e5b3..3e4a9b6 100644 --- a/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs +++ b/generators/angular-audit/templates/src/main/webapp/app/admin/entity-audit/entity-audit-modal.component.html.ejs @@ -1,5 +1,5 @@ @@ -10,13 +10,13 @@

- Translate="entityAudit.detail.old"> Old/Removed value + __jhiTranslateTag__('entityAudit.detail.old')   - Translate="entityAudit.detail.new"> New/Added value + __jhiTranslateTag__('entityAudit.detail.new')

- +